1. Implémentation du Perceptron Multi-Couches (PMC)

Caractéristiques du PMC : Structure en couches entièrement connectées :

Un MLP est composé de plusieurs couches de neurones entièrement connectées (Dense layers en Keras). Chaque neurone de la couche précédente est connecté à chaque neurone de la couche suivante. Fonctions d’activation :

Les fonctions d’activation (comme relu ou sigmoid) introduisent de la non-linéarité, permettant au modèle de capturer des relations complexes. Plusieurs couches cachées :

Un MLP a au moins une couche cachée entre la couche d’entrée et la couche de sortie.

# Chargement des bibliothèques utiles pour l'execution de ce notebook
library(ggplot2)
library(reticulate)
library(pROC)
Type 'citation("pROC")' for a citation.

Attachement du package : ‘pROC’

L'objet suivant est masqué depuis ‘package:imager’:

    ci

Les objets suivants sont masqués depuis ‘package:stats’:

    cov, smooth, var
library(caret)
suppressPackageStartupMessages(library(caret))
Sys.setenv(TF_CPP_MIN_LOG_LEVEL = "2")
library(keras)
library(reticulate)
use_condaenv("tf", conda = "C:/Users/beriv/anaconda3/condabin/conda.bat")
py_config()
python:         C:/Users/beriv/anaconda3/envs/tf/python.exe
libpython:      C:/Users/beriv/anaconda3/envs/tf/python310.dll
pythonhome:     C:/Users/beriv/anaconda3/envs/tf
version:        3.10.13 | packaged by Anaconda, Inc. | (main, Sep 11 2023, 13:15:57) [MSC v.1916 64 bit (AMD64)]
Architecture:   64bit
numpy:          C:/Users/beriv/anaconda3/envs/tf/Lib/site-packages/numpy
numpy_version:  1.26.3
tensorflow:     C:\Users\beriv\ANACON~1\envs\tf\lib\site-packages\tensorflow\__init__.p

NOTE: Python version was forced by use_python() function

# Charger le dataset MNIST
data <- dataset_mnist()
x_train <- data$train$x
y_train <- data$train$y
x_test <- data$test$x
y_test <- data$test$y

# Prétraitement des données
x_train <- array_reshape(x_train, c(nrow(x_train), 28 * 28)) / 255
x_test <- array_reshape(x_test, c(nrow(x_test), 28 * 28)) / 255

y_train <- as.numeric(y_train)
y_test <- as.numeric(y_test)
# Séparer les données normales et anormales (par exemple, les 0 sont normaux)
normal_class <- 0

x_train_normal <- x_train[y_train == normal_class, ]
x_test_normal <- x_test[y_test == normal_class, ]
x_test_anomaly <- x_test[y_test != normal_class, ]
# Construire un modèle MLP pour encoder les données normales
model <- keras_model_sequential() %>% 
  layer_dense(units = 128, activation = 'relu', input_shape = c(28 * 28)) %>% 
  layer_dense(units = 64, activation = 'relu') %>% 
  layer_dense(units = 32, activation = 'relu', name = "latent") %>% 
  layer_dense(units = 64, activation = 'relu') %>% 
  layer_dense(units = 128, activation = 'relu') %>% 
  layer_dense(units = 28 * 28, activation = 'sigmoid')

model %>% compile(
  optimizer = 'adam',
  loss = 'mean_squared_error'
)
  1. Couches entièrement connectées :

Chaque layer_dense représente une couche entièrement connectée. Non-linéarité :

  1. Les fonctions d’activation relu et sigmoid ajoutent la non-linéarité nécessaire. Plusieurs couches cachées :

  2. Le modèle contient plusieurs couches intermédiaires (couches cachées) : 128 → 64 → 32 → 64 → 128. Nombreuses unités (neurones) :

  3. Chaque couche contient un nombre défini d’unités (neurones), comme 128 ou 64.

# Entraîner le modèle uniquement sur les données normales
history <- model %>% fit(
  x_train_normal, x_train_normal,
  epochs = 30,
  batch_size = 256,
  validation_split = 0.2
)
Epoch 1/30

 1/19 [>.............................] - ETA: 26s - loss: 0.2277
 5/19 [======>.......................] - ETA: 0s - loss: 0.2226 
10/19 [==============>...............] - ETA: 0s - loss: 0.2016
17/19 [=========================>....] - ETA: 0s - loss: 0.1596
19/19 [==============================] - 2s 11ms/step - loss: 0.1527

19/19 [==============================] - 4s 134ms/step - loss: 0.1527 - val_loss: 0.0721
Epoch 2/30

 1/19 [>.............................] - ETA: 0s - loss: 0.0736
 6/19 [========>.....................] - ETA: 0s - loss: 0.0714
11/19 [================>.............] - ETA: 0s - loss: 0.0698
17/19 [=========================>....] - ETA: 0s - loss: 0.0688
19/19 [==============================] - 0s 13ms/step - loss: 0.0684

19/19 [==============================] - 0s 26ms/step - loss: 0.0684 - val_loss: 0.0631
Epoch 3/30

 1/19 [>.............................] - ETA: 0s - loss: 0.0639
 8/19 [===========>..................] - ETA: 0s - loss: 0.0626
15/19 [======================>.......] - ETA: 0s - loss: 0.0614
19/19 [==============================] - 0s 9ms/step - loss: 0.0606

19/19 [==============================] - 1s 32ms/step - loss: 0.0606 - val_loss: 0.0547
Epoch 4/30

 1/19 [>.............................] - ETA: 0s - loss: 0.0567
 7/19 [==========>...................] - ETA: 0s - loss: 0.0540
13/19 [===================>..........] - ETA: 0s - loss: 0.0527
19/19 [==============================] - 0s 9ms/step - loss: 0.0514

19/19 [==============================] - 1s 29ms/step - loss: 0.0514 - val_loss: 0.0458
Epoch 5/30

 1/19 [>.............................] - ETA: 0s - loss: 0.0473
 5/19 [======>.......................] - ETA: 0s - loss: 0.0463
10/19 [==============>...............] - ETA: 0s - loss: 0.0456
15/19 [======================>.......] - ETA: 0s - loss: 0.0449
19/19 [==============================] - 0s 13ms/step - loss: 0.0446

19/19 [==============================] - 1s 29ms/step - loss: 0.0446 - val_loss: 0.0418
Epoch 6/30

 1/19 [>.............................] - ETA: 0s - loss: 0.0421
 8/19 [===========>..................] - ETA: 0s - loss: 0.0420
14/19 [=====================>........] - ETA: 0s - loss: 0.0415
18/19 [===========================>..] - ETA: 0s - loss: 0.0411
19/19 [==============================] - 0s 9ms/step - loss: 0.0410

19/19 [==============================] - 1s 29ms/step - loss: 0.0410 - val_loss: 0.0381
Epoch 7/30

 1/19 [>.............................] - ETA: 0s - loss: 0.0388
 5/19 [======>.......................] - ETA: 0s - loss: 0.0390
11/19 [================>.............] - ETA: 0s - loss: 0.0380
16/19 [========================>.....] - ETA: 0s - loss: 0.0374
19/19 [==============================] - 0s 12ms/step - loss: 0.0371

19/19 [==============================] - 1s 30ms/step - loss: 0.0371 - val_loss: 0.0346
Epoch 8/30

 1/19 [>.............................] - ETA: 0s - loss: 0.0354
 8/19 [===========>..................] - ETA: 0s - loss: 0.0344
14/19 [=====================>........] - ETA: 0s - loss: 0.0340
19/19 [==============================] - 0s 9ms/step - loss: 0.0339

19/19 [==============================] - 1s 29ms/step - loss: 0.0339 - val_loss: 0.0323
Epoch 9/30

 1/19 [>.............................] - ETA: 0s - loss: 0.0322
 7/19 [==========>...................] - ETA: 0s - loss: 0.0323
13/19 [===================>..........] - ETA: 0s - loss: 0.0320
19/19 [==============================] - 0s 12ms/step - loss: 0.0317

19/19 [==============================] - 1s 30ms/step - loss: 0.0317 - val_loss: 0.0304
Epoch 10/30

 1/19 [>.............................] - ETA: 0s - loss: 0.0298
 5/19 [======>.......................] - ETA: 0s - loss: 0.0300
 9/19 [=============>................] - ETA: 0s - loss: 0.0299
15/19 [======================>.......] - ETA: 0s - loss: 0.0298
19/19 [==============================] - 0s 13ms/step - loss: 0.0297

19/19 [==============================] - 1s 31ms/step - loss: 0.0297 - val_loss: 0.0287
Epoch 11/30

 1/19 [>.............................] - ETA: 0s - loss: 0.0282
 6/19 [========>.....................] - ETA: 0s - loss: 0.0285
10/19 [==============>...............] - ETA: 0s - loss: 0.0285
17/19 [=========================>....] - ETA: 0s - loss: 0.0280
19/19 [==============================] - 0s 13ms/step - loss: 0.0280

19/19 [==============================] - 1s 29ms/step - loss: 0.0280 - val_loss: 0.0270
Epoch 12/30

 1/19 [>.............................] - ETA: 0s - loss: 0.0257
 8/19 [===========>..................] - ETA: 0s - loss: 0.0268
15/19 [======================>.......] - ETA: 0s - loss: 0.0266
19/19 [==============================] - 0s 9ms/step - loss: 0.0266

19/19 [==============================] - 0s 27ms/step - loss: 0.0266 - val_loss: 0.0258
Epoch 13/30

 1/19 [>.............................] - ETA: 0s - loss: 0.0259
 7/19 [==========>...................] - ETA: 0s - loss: 0.0258
14/19 [=====================>........] - ETA: 0s - loss: 0.0253
19/19 [==============================] - 0s 11ms/step - loss: 0.0253

19/19 [==============================] - 0s 24ms/step - loss: 0.0253 - val_loss: 0.0245
Epoch 14/30

 1/19 [>.............................] - ETA: 0s - loss: 0.0244
 7/19 [==========>...................] - ETA: 0s - loss: 0.0244
12/19 [=================>............] - ETA: 0s - loss: 0.0242
19/19 [==============================] - 0s 9ms/step - loss: 0.0241

19/19 [==============================] - 0s 25ms/step - loss: 0.0241 - val_loss: 0.0234
Epoch 15/30

 1/19 [>.............................] - ETA: 0s - loss: 0.0230
 8/19 [===========>..................] - ETA: 0s - loss: 0.0233
15/19 [======================>.......] - ETA: 0s - loss: 0.0233
19/19 [==============================] - 0s 8ms/step - loss: 0.0231

19/19 [==============================] - 0s 25ms/step - loss: 0.0231 - val_loss: 0.0226
Epoch 16/30

 1/19 [>.............................] - ETA: 0s - loss: 0.0226
 7/19 [==========>...................] - ETA: 0s - loss: 0.0227
13/19 [===================>..........] - ETA: 0s - loss: 0.0224
19/19 [==============================] - 0s 9ms/step - loss: 0.0222

19/19 [==============================] - 0s 22ms/step - loss: 0.0222 - val_loss: 0.0218
Epoch 17/30

 1/19 [>.............................] - ETA: 0s - loss: 0.0223
 8/19 [===========>..................] - ETA: 0s - loss: 0.0215
15/19 [======================>.......] - ETA: 0s - loss: 0.0215
19/19 [==============================] - 0s 8ms/step - loss: 0.0214

19/19 [==============================] - 0s 24ms/step - loss: 0.0214 - val_loss: 0.0211
Epoch 18/30

 1/19 [>.............................] - ETA: 0s - loss: 0.0207
 8/19 [===========>..................] - ETA: 0s - loss: 0.0208
15/19 [======================>.......] - ETA: 0s - loss: 0.0207
19/19 [==============================] - 0s 8ms/step - loss: 0.0207

19/19 [==============================] - 0s 23ms/step - loss: 0.0207 - val_loss: 0.0208
Epoch 19/30

 1/19 [>.............................] - ETA: 0s - loss: 0.0201
 8/19 [===========>..................] - ETA: 0s - loss: 0.0203
15/19 [======================>.......] - ETA: 0s - loss: 0.0202
19/19 [==============================] - 0s 8ms/step - loss: 0.0202

19/19 [==============================] - 0s 25ms/step - loss: 0.0202 - val_loss: 0.0201
Epoch 20/30

 1/19 [>.............................] - ETA: 0s - loss: 0.0199
 6/19 [========>.....................] - ETA: 0s - loss: 0.0200
12/19 [=================>............] - ETA: 0s - loss: 0.0198
19/19 [==============================] - 0s 11ms/step - loss: 0.0197

19/19 [==============================] - 1s 29ms/step - loss: 0.0197 - val_loss: 0.0196
Epoch 21/30

 1/19 [>.............................] - ETA: 0s - loss: 0.0184
 8/19 [===========>..................] - ETA: 0s - loss: 0.0189
15/19 [======================>.......] - ETA: 0s - loss: 0.0192
19/19 [==============================] - 0s 8ms/step - loss: 0.0192

19/19 [==============================] - 0s 20ms/step - loss: 0.0192 - val_loss: 0.0195
Epoch 22/30

 1/19 [>.............................] - ETA: 0s - loss: 0.0197
 8/19 [===========>..................] - ETA: 0s - loss: 0.0187
15/19 [======================>.......] - ETA: 0s - loss: 0.0188
19/19 [==============================] - 0s 8ms/step - loss: 0.0188

19/19 [==============================] - 0s 24ms/step - loss: 0.0188 - val_loss: 0.0191
Epoch 23/30

 1/19 [>.............................] - ETA: 0s - loss: 0.0188
 8/19 [===========>..................] - ETA: 0s - loss: 0.0187
15/19 [======================>.......] - ETA: 0s - loss: 0.0186
19/19 [==============================] - 0s 9ms/step - loss: 0.0185

19/19 [==============================] - 0s 24ms/step - loss: 0.0185 - val_loss: 0.0186
Epoch 24/30

 1/19 [>.............................] - ETA: 0s - loss: 0.0184
 8/19 [===========>..................] - ETA: 0s - loss: 0.0181
15/19 [======================>.......] - ETA: 0s - loss: 0.0181
19/19 [==============================] - 0s 8ms/step - loss: 0.0181

19/19 [==============================] - 0s 23ms/step - loss: 0.0181 - val_loss: 0.0181
Epoch 25/30

 1/19 [>.............................] - ETA: 0s - loss: 0.0179
 8/19 [===========>..................] - ETA: 0s - loss: 0.0177
13/19 [===================>..........] - ETA: 0s - loss: 0.0176
19/19 [==============================] - 0s 9ms/step - loss: 0.0176

19/19 [==============================] - 1s 30ms/step - loss: 0.0176 - val_loss: 0.0177
Epoch 26/30

 1/19 [>.............................] - ETA: 0s - loss: 0.0175
 7/19 [==========>...................] - ETA: 0s - loss: 0.0172
13/19 [===================>..........] - ETA: 0s - loss: 0.0172
19/19 [==============================] - 0s 11ms/step - loss: 0.0172

19/19 [==============================] - 0s 22ms/step - loss: 0.0172 - val_loss: 0.0174
Epoch 27/30

 1/19 [>.............................] - ETA: 0s - loss: 0.0166
 9/19 [=============>................] - ETA: 0s - loss: 0.0169
15/19 [======================>.......] - ETA: 0s - loss: 0.0170
19/19 [==============================] - 0s 8ms/step - loss: 0.0170

19/19 [==============================] - 0s 23ms/step - loss: 0.0170 - val_loss: 0.0170
Epoch 28/30

 1/19 [>.............................] - ETA: 0s - loss: 0.0171
 8/19 [===========>..................] - ETA: 0s - loss: 0.0168
13/19 [===================>..........] - ETA: 0s - loss: 0.0168
19/19 [==============================] - 0s 8ms/step - loss: 0.0166

19/19 [==============================] - 0s 24ms/step - loss: 0.0166 - val_loss: 0.0168
Epoch 29/30

 1/19 [>.............................] - ETA: 0s - loss: 0.0164
 7/19 [==========>...................] - ETA: 0s - loss: 0.0165
14/19 [=====================>........] - ETA: 0s - loss: 0.0164
19/19 [==============================] - 0s 8ms/step - loss: 0.0164

19/19 [==============================] - 0s 25ms/step - loss: 0.0164 - val_loss: 0.0166
Epoch 30/30

 1/19 [>.............................] - ETA: 0s - loss: 0.0161
 6/19 [========>.....................] - ETA: 0s - loss: 0.0161
11/19 [================>.............] - ETA: 0s - loss: 0.0160
16/19 [========================>.....] - ETA: 0s - loss: 0.0160
19/19 [==============================] - 0s 12ms/step - loss: 0.0161

19/19 [==============================] - 0s 27ms/step - loss: 0.0161 - val_loss: 0.0162
# Calculer l'erreur de reconstruction pour les données normales et anormales
reconstruction_error <- function(model, data) {
  reconstructed <- model %>% predict(data)
  errors <- rowSums((data - reconstructed)^2)
  return(errors)
}
normal_errors <- reconstruction_error(model, x_test_normal)

 1/31 [..............................] - ETA: 4s
 5/31 [===>..........................] - ETA: 0s
17/31 [===============>..............] - ETA: 0s
31/31 [==============================] - 0s 6ms/step

31/31 [==============================] - 0s 6ms/step
anomaly_errors <- reconstruction_error(model, x_test_anomaly)

  1/282 [..............................] - ETA: 12s
 20/282 [=>............................] - ETA: 0s 
 37/282 [==>...........................] - ETA: 0s
 54/282 [====>.........................] - ETA: 0s
 72/282 [======>.......................] - ETA: 0s
 91/282 [========>.....................] - ETA: 0s
112/282 [==========>...................] - ETA: 0s
134/282 [=============>................] - ETA: 0s
157/282 [===============>..............] - ETA: 0s
177/282 [=================>............] - ETA: 0s
196/282 [===================>..........] - ETA: 0s
218/282 [======================>.......] - ETA: 0s
237/282 [========================>.....] - ETA: 0s
258/282 [==========================>...] - ETA: 0s
280/282 [============================>.] - ETA: 0s
282/282 [==============================] - 1s 3ms/step

282/282 [==============================] - 1s 3ms/step
# Définir un seuil pour détecter les anomalies
threshold <- quantile(normal_errors, 0.95)

# Identifier les anomalies
is_anomaly <- function(errors, threshold) {
  return(errors > threshold)
}

normal_anomalies <- is_anomaly(normal_errors, threshold)
anomaly_detected <- is_anomaly(anomaly_errors, threshold)

# Résumé des résultats
cat("Seuil d'anomalie:", threshold, "\n")
Seuil d'anomalie: 24.32507 
cat("Taux de détection d'anomalies parmi les données normales:", mean(normal_anomalies), "\n")
Taux de détection d'anomalies parmi les données normales: 0.05 
cat("Taux de détection d'anomalies parmi les anomalies:", mean(anomaly_detected), "\n")
Taux de détection d'anomalies parmi les anomalies: 0.9900222 
# Simuler des prédictions et des labels réels
set.seed(42)
actual <- c(rep(0, 50), rep(1, 50))  # Labels réels : 50 normaux, 50 anomalies
predicted <- c(rep(0, 45), rep(1, 5), rep(0, 10), rep(1, 40))  # Prédictions du modèle

# Afficher la matrice de confusion
conf_matrix <- confusionMatrix(as.factor(predicted), as.factor(actual))
print(conf_matrix)
Confusion Matrix and Statistics

          Reference
Prediction  0  1
         0 45 10
         1  5 40
                                          
               Accuracy : 0.85            
                 95% CI : (0.7647, 0.9135)
    No Information Rate : 0.5             
    P-Value [Acc > NIR] : 2.413e-13       
                                          
                  Kappa : 0.7             
                                          
 Mcnemar's Test P-Value : 0.3017          
                                          
            Sensitivity : 0.9000          
            Specificity : 0.8000          
         Pos Pred Value : 0.8182          
         Neg Pred Value : 0.8889          
             Prevalence : 0.5000          
         Detection Rate : 0.4500          
   Detection Prevalence : 0.5500          
      Balanced Accuracy : 0.8500          
                                          
       'Positive' Class : 0               
                                          
# Calculer et afficher le rapport de classification
precision <- conf_matrix$byClass["Precision"]
recall <- conf_matrix$byClass["Recall"]
f1_score <- 2 * (precision * recall) / (precision + recall)

cat("\nRapport de Classification :\n")

Rapport de Classification :
cat("Précision :", round(precision, 2), "\n")
Précision : 0.82 
cat("Rappel :", round(recall, 2), "\n")
Rappel : 0.9 
cat("F1-Score :", round(f1_score, 2), "\n")
F1-Score : 0.86 
# Aplatir les images pour obtenir des vecteurs
x_train_flat <- array_reshape(x_train, c(nrow(x_train), 28 * 28)) / 255
x_test_flat <- array_reshape(x_test, c(nrow(x_test), 28 * 28)) / 255

# Calculer les moyennes et écarts-types sur l'ensemble d'entraînement
train_mean <- colMeans(x_train_flat, na.rm = TRUE)
train_sd <- apply(x_train_flat, 2, function(x) sd(x, na.rm = TRUE))

# Éviter la division par zéro en remplaçant les écarts-types nuls par une petite valeur
train_sd[train_sd < 0.01] <- 0.01

# Calcul des scores Z
z_scores <- abs(sweep(x_test_flat, 2, train_mean, "-") / train_sd)

# Définir un seuil basé sur les données normales
threshold <- quantile(rowMeans(z_scores), 0.95)  # Seuil au 99e percentile
anomalies <- rowMeans(z_scores > threshold) > 0
cat("Nombre d'anomalies détectées :", sum(anomalies), "\n")
Nombre d'anomalies détectées : 10000 
# Afficher le nombre d'anomalies détectées
cat("Nombre d'anomalies détectées :", sum(anomalies, na.rm = TRUE), "\n")
Nombre d'anomalies détectées : 10000 
# Visualiser une anomalie
if (any(anomalies, na.rm = TRUE)) {
  idx <- which(anomalies)[1]  # Index de la première anomalie
  image(matrix(x_test[idx, , ], 28, 28), col = gray.colors(256), main = "Anomalie détectée")
}

summary(train_mean)
     Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
0.0000000 0.0004864 0.0283191 0.1306605 0.2701763 0.5472690 
summary(train_sd)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
0.000001 0.017972 0.144604 0.193221 0.394989 0.446329 

DISTANCE DE MAHALANOBIS


x_train <- mnist$train$x
x_test <- mnist$test$x

# Aplatir les images pour obtenir des vecteurs
x_train_flat <- array_reshape(x_train, c(nrow(x_train), 28 * 28)) / 255
x_test_flat <- array_reshape(x_test, c(nrow(x_test), 28 * 28)) / 255

# Vérifier et éliminer les colonnes avec faible variance
keep <- apply(x_train_flat, 2, var) > 1e-6
x_train_flat <- x_train_flat[, keep]
x_test_flat <- x_test_flat[, keep]

# Réduction de dimension avec PCA (facultatif, si les données sont encore trop corrélées)
library(stats)
pca_result <- prcomp(x_train_flat, center = TRUE, scale. = TRUE)

# Conserver les 100 premières composantes
num_components <- 100
x_train_pca <- pca_result$x[, 1:num_components]
x_test_pca <- predict(pca_result, newdata = x_test_flat)[, 1:num_components]

# Calculer la matrice de covariance et son inverse avec régularisation
epsilon <- 1e-6  # Petite valeur pour régulariser
cov_matrix <- cov(x_train_pca) + diag(epsilon, ncol(x_train_pca))
inv_cov_matrix <- solve(cov_matrix)

# Calculer la moyenne des données d'entraînement
mean_vector <- colMeans(x_train_pca)

# Fonction pour calculer la distance de Mahalanobis
mahalanobis_distance <- function(x, mean, inv_cov) {
  diff <- x - mean
  sqrt(rowSums((diff %*% inv_cov) * diff))
}

# Calculer les distances de Mahalanobis pour les données de test
distances <- mahalanobis_distance(x_test_pca, mean_vector, inv_cov_matrix)

# Définir un seuil basé sur le quantile des distances
threshold <- quantile(distances, 0.99)  # Seuil au 99e percentile

# Identifier les anomalies
anomalies <- distances > threshold
cat("Nombre d'anomalies détectées :", sum(anomalies), "\n")
Nombre d'anomalies détectées : 100 
# Visualiser une anomalie
if (any(anomalies)) {
  idx <- which(anomalies)[1]  # Index de la première anomalie
  image(matrix(x_test[idx, , ], 28, 28), col = gray.colors(256), main = "Anomalie détectée")
}

str(x_train)
 int [1:60000, 1:28, 1:28] 0 0 0 0 0 0 0 0 0 0 ...
# Chargement les bibliothèques nécessaires
library(imager)
# Étape 1 : Aplatir les images
x_test_flat <- apply(x_test, 1, function(image) {
  as.vector(image)  # Aplatir chaque matrice en vecteur
})
x_test_flat <- t(x_test_flat)  # Transposer pour obtenir (N x 784)
cat("Dimensions de x_test_flat :", dim(x_test_flat), "\n")
Dimensions de x_test_flat : 10000 784 
# Étape 2 : Générer les anomalies
apply_transformations <- function(image) {
  image_matrix <- matrix(image, nrow = 28, ncol = 28)
  transformed_image <- imrotate(as.cimg(image_matrix), angle = sample(c(-45, 45), 1)) # Rotation large
  scaled_image <- imresize(transformed_image, scale = runif(1, 0.5, 2.0)) # Échelle variable
  noisy_image <- scaled_image + rnorm(length(scaled_image), mean = 0, sd = 0.1) # Bruit
  return(as.vector(as.numeric(noisy_image)))
}


  # Appliquer une transformation (exemple : rotation et mise à l'échelle)
  rotated_image <- imrotate(as.cimg(image_matrix), angle = sample(c(-30, 30), 1)) # Rotation
Erreur : objet 'image_matrix' introuvable
# Charger les bibliothèques nécessaires
library(keras)
library(caret)

# Étape 1 : Préparer les données
# Charger le dataset MNIST
data <- dataset_mnist()
x_train <- data$train$x
y_train <- data$train$y
x_test <- data$test$x
y_test <- data$test$y

# Aplatir les images en vecteurs 784 et normaliser
x_train_flat <- apply(x_train, 1, function(image) as.vector(image)) / 255
x_train_flat <- t(x_train_flat)

x_test_flat <- apply(x_test, 1, function(image) as.vector(image)) / 255
x_test_flat <- t(x_test_flat)

# Étape 2 : Générer les anomalies
apply_transformations <- function(image) {
  # Reshape l'image aplatie en une matrice 28x28
  image_matrix <- matrix(image, nrow = 28, ncol = 28)

  # Appliquer une transformation (exemple : rotation et mise à l'échelle)
  rotated_image <- imrotate(as.cimg(image_matrix), angle = sample(c(-30, 30), 1)) # Rotation
  scaled_image <- imresize(rotated_image, scale = 1.2) # Mise à l'échelle

  # Remettre au format 28x28 (padding ou recadrage si nécessaire)
  scaled_image <- resize(scaled_image, size_x = 28, size_y = 28)

  return(as.vector(as.numeric(scaled_image))) # Retourner le vecteur aplati
}

# Filtrer les données normales : toutes les images nettes, non transformées
x_train_normal <- x_train_flat
x_test_normal <- x_test_flat

# Créer des anomalies en appliquant des transformations sur x_test_flat
set.seed(42) # Fixer une graine pour la reproductibilité
x_test_anomaly <- t(apply(x_test_flat, 1, apply_transformations))

# Étape 3 : Définir et entraîner l'autoencodeur
model <- keras_model_sequential() %>%
  layer_dense(units = 128, activation = 'relu', input_shape = c(28 * 28)) %>%
  layer_dense(units = 64, activation = 'relu') %>%
  layer_dense(units = 32, activation = 'relu', name = "latent") %>%
  layer_dense(units = 64, activation = 'relu') %>%
  layer_dense(units = 128, activation = 'relu') %>%
  layer_dense(units = 28 * 28, activation = 'sigmoid')

model %>% compile(
  optimizer = 'adam',
  loss = 'mean_squared_error'
)

# Entraîner uniquement sur les données normales
history <- model %>% fit(
  x_train_normal, x_train_normal,
  epochs = 30,
  batch_size = 256,
  validation_split = 0.2
)
Epoch 1/30

  1/188 [..............................] - ETA: 3:17 - loss: 0.2307
  7/188 [>.............................] - ETA: 1s - loss: 0.2195  
 14/188 [=>............................] - ETA: 1s - loss: 0.1811
 21/188 [==>...........................] - ETA: 1s - loss: 0.1485
 28/188 [===>..........................] - ETA: 1s - loss: 0.1304
 36/188 [====>.........................] - ETA: 1s - loss: 0.1178
 43/188 [=====>........................] - ETA: 1s - loss: 0.1105
 50/188 [======>.......................] - ETA: 1s - loss: 0.1051
 57/188 [========>.....................] - ETA: 1s - loss: 0.1007
 64/188 [=========>....................] - ETA: 0s - loss: 0.0972
 73/188 [==========>...................] - ETA: 0s - loss: 0.0936
 80/188 [===========>..................] - ETA: 0s - loss: 0.0912
 87/188 [============>.................] - ETA: 0s - loss: 0.0890
 94/188 [==============>...............] - ETA: 0s - loss: 0.0871
101/188 [===============>..............] - ETA: 0s - loss: 0.0853
108/188 [================>.............] - ETA: 0s - loss: 0.0837
115/188 [=================>............] - ETA: 0s - loss: 0.0823
123/188 [==================>...........] - ETA: 0s - loss: 0.0806
131/188 [===================>..........] - ETA: 0s - loss: 0.0791
138/188 [=====================>........] - ETA: 0s - loss: 0.0779
146/188 [======================>.......] - ETA: 0s - loss: 0.0765
153/188 [=======================>......] - ETA: 0s - loss: 0.0753
160/188 [========================>.....] - ETA: 0s - loss: 0.0741
167/188 [=========================>....] - ETA: 0s - loss: 0.0730
174/188 [==========================>...] - ETA: 0s - loss: 0.0720
182/188 [============================>.] - ETA: 0s - loss: 0.0708
188/188 [==============================] - 2s 8ms/step - loss: 0.0700

188/188 [==============================] - 3s 13ms/step - loss: 0.0700 - val_loss: 0.0439
Epoch 2/30

  1/188 [..............................] - ETA: 2s - loss: 0.0437
  7/188 [>.............................] - ETA: 1s - loss: 0.0443
 11/188 [>.............................] - ETA: 2s - loss: 0.0440
 16/188 [=>............................] - ETA: 2s - loss: 0.0436
 21/188 [==>...........................] - ETA: 2s - loss: 0.0433
 27/188 [===>..........................] - ETA: 1s - loss: 0.0429
 33/188 [====>.........................] - ETA: 1s - loss: 0.0427
 39/188 [=====>........................] - ETA: 1s - loss: 0.0424
 44/188 [======>.......................] - ETA: 1s - loss: 0.0421
 51/188 [=======>......................] - ETA: 1s - loss: 0.0418
 57/188 [========>.....................] - ETA: 1s - loss: 0.0414
 64/188 [=========>....................] - ETA: 1s - loss: 0.0411
 72/188 [==========>...................] - ETA: 1s - loss: 0.0408
 79/188 [===========>..................] - ETA: 1s - loss: 0.0404
 88/188 [=============>................] - ETA: 0s - loss: 0.0400
 95/188 [==============>...............] - ETA: 0s - loss: 0.0397
102/188 [===============>..............] - ETA: 0s - loss: 0.0395
109/188 [================>.............] - ETA: 0s - loss: 0.0392
117/188 [=================>............] - ETA: 0s - loss: 0.0388
125/188 [==================>...........] - ETA: 0s - loss: 0.0385
133/188 [====================>.........] - ETA: 0s - loss: 0.0382
140/188 [=====================>........] - ETA: 0s - loss: 0.0379
146/188 [======================>.......] - ETA: 0s - loss: 0.0377
153/188 [=======================>......] - ETA: 0s - loss: 0.0374
160/188 [========================>.....] - ETA: 0s - loss: 0.0371
167/188 [=========================>....] - ETA: 0s - loss: 0.0368
174/188 [==========================>...] - ETA: 0s - loss: 0.0366
181/188 [===========================>..] - ETA: 0s - loss: 0.0364
188/188 [==============================] - 2s 8ms/step - loss: 0.0361

188/188 [==============================] - 2s 10ms/step - loss: 0.0361 - val_loss: 0.0294
Epoch 3/30

  1/188 [..............................] - ETA: 1s - loss: 0.0298
  8/188 [>.............................] - ETA: 1s - loss: 0.0288
 13/188 [=>............................] - ETA: 2s - loss: 0.0285
 16/188 [=>............................] - ETA: 2s - loss: 0.0285
 22/188 [==>...........................] - ETA: 1s - loss: 0.0285
 27/188 [===>..........................] - ETA: 1s - loss: 0.0284
 33/188 [====>.........................] - ETA: 1s - loss: 0.0284
 38/188 [=====>........................] - ETA: 1s - loss: 0.0283
 45/188 [======>.......................] - ETA: 1s - loss: 0.0282
 52/188 [=======>......................] - ETA: 1s - loss: 0.0281
 59/188 [========>.....................] - ETA: 1s - loss: 0.0279
 66/188 [=========>....................] - ETA: 1s - loss: 0.0278
 73/188 [==========>...................] - ETA: 1s - loss: 0.0276
 80/188 [===========>..................] - ETA: 1s - loss: 0.0274
 88/188 [=============>................] - ETA: 0s - loss: 0.0273
 96/188 [==============>...............] - ETA: 0s - loss: 0.0272
101/188 [===============>..............] - ETA: 0s - loss: 0.0271
106/188 [===============>..............] - ETA: 0s - loss: 0.0270
112/188 [================>.............] - ETA: 0s - loss: 0.0269
118/188 [=================>............] - ETA: 0s - loss: 0.0268
125/188 [==================>...........] - ETA: 0s - loss: 0.0266
131/188 [===================>..........] - ETA: 0s - loss: 0.0265
137/188 [====================>.........] - ETA: 0s - loss: 0.0264
142/188 [=====================>........] - ETA: 0s - loss: 0.0263
147/188 [======================>.......] - ETA: 0s - loss: 0.0263
153/188 [=======================>......] - ETA: 0s - loss: 0.0262
159/188 [========================>.....] - ETA: 0s - loss: 0.0261
165/188 [=========================>....] - ETA: 0s - loss: 0.0260
171/188 [==========================>...] - ETA: 0s - loss: 0.0259
178/188 [===========================>..] - ETA: 0s - loss: 0.0258
185/188 [============================>.] - ETA: 0s - loss: 0.0258
188/188 [==============================] - 2s 9ms/step - loss: 0.0257

188/188 [==============================] - 2s 11ms/step - loss: 0.0257 - val_loss: 0.0234
Epoch 4/30

  1/188 [..............................] - ETA: 1s - loss: 0.0235
  7/188 [>.............................] - ETA: 1s - loss: 0.0234
 14/188 [=>............................] - ETA: 1s - loss: 0.0231
 19/188 [==>...........................] - ETA: 1s - loss: 0.0230
 25/188 [==>...........................] - ETA: 1s - loss: 0.0229
 29/188 [===>..........................] - ETA: 1s - loss: 0.0229
 35/188 [====>.........................] - ETA: 1s - loss: 0.0228
 40/188 [=====>........................] - ETA: 1s - loss: 0.0228
 46/188 [======>.......................] - ETA: 1s - loss: 0.0228
 53/188 [=======>......................] - ETA: 1s - loss: 0.0227
 59/188 [========>.....................] - ETA: 1s - loss: 0.0227
 66/188 [=========>....................] - ETA: 1s - loss: 0.0226
 73/188 [==========>...................] - ETA: 1s - loss: 0.0226
 79/188 [===========>..................] - ETA: 1s - loss: 0.0226
 86/188 [============>.................] - ETA: 0s - loss: 0.0225
 93/188 [=============>................] - ETA: 0s - loss: 0.0225
 99/188 [==============>...............] - ETA: 0s - loss: 0.0225
105/188 [===============>..............] - ETA: 0s - loss: 0.0225
112/188 [================>.............] - ETA: 0s - loss: 0.0224
118/188 [=================>............] - ETA: 0s - loss: 0.0224
124/188 [==================>...........] - ETA: 0s - loss: 0.0223
129/188 [===================>..........] - ETA: 0s - loss: 0.0223
134/188 [====================>.........] - ETA: 0s - loss: 0.0223
140/188 [=====================>........] - ETA: 0s - loss: 0.0222
145/188 [======================>.......] - ETA: 0s - loss: 0.0222
150/188 [======================>.......] - ETA: 0s - loss: 0.0221
154/188 [=======================>......] - ETA: 0s - loss: 0.0221
160/188 [========================>.....] - ETA: 0s - loss: 0.0220
167/188 [=========================>....] - ETA: 0s - loss: 0.0220
173/188 [==========================>...] - ETA: 0s - loss: 0.0220
178/188 [===========================>..] - ETA: 0s - loss: 0.0220
184/188 [============================>.] - ETA: 0s - loss: 0.0219
188/188 [==============================] - 2s 10ms/step - loss: 0.0219

188/188 [==============================] - 2s 12ms/step - loss: 0.0219 - val_loss: 0.0210
Epoch 5/30

  1/188 [..............................] - ETA: 2s - loss: 0.0204
  6/188 [..............................] - ETA: 2s - loss: 0.0208
 10/188 [>.............................] - ETA: 2s - loss: 0.0208
 15/188 [=>............................] - ETA: 2s - loss: 0.0206
 21/188 [==>...........................] - ETA: 1s - loss: 0.0206
 27/188 [===>..........................] - ETA: 1s - loss: 0.0205
 32/188 [====>.........................] - ETA: 1s - loss: 0.0204
 38/188 [=====>........................] - ETA: 1s - loss: 0.0204
 44/188 [======>.......................] - ETA: 1s - loss: 0.0204
 49/188 [======>.......................] - ETA: 1s - loss: 0.0204
 56/188 [=======>......................] - ETA: 1s - loss: 0.0204
 63/188 [=========>....................] - ETA: 1s - loss: 0.0203
 69/188 [==========>...................] - ETA: 1s - loss: 0.0203
 75/188 [==========>...................] - ETA: 1s - loss: 0.0202
 80/188 [===========>..................] - ETA: 1s - loss: 0.0202
 86/188 [============>.................] - ETA: 0s - loss: 0.0202
 92/188 [=============>................] - ETA: 1s - loss: 0.0202
 98/188 [==============>...............] - ETA: 0s - loss: 0.0201
 99/188 [==============>...............] - ETA: 1s - loss: 0.0201
104/188 [===============>..............] - ETA: 0s - loss: 0.0201
108/188 [================>.............] - ETA: 0s - loss: 0.0201
112/188 [================>.............] - ETA: 0s - loss: 0.0201
117/188 [=================>............] - ETA: 0s - loss: 0.0201
123/188 [==================>...........] - ETA: 0s - loss: 0.0200
130/188 [===================>..........] - ETA: 0s - loss: 0.0200
136/188 [====================>.........] - ETA: 0s - loss: 0.0200
142/188 [=====================>........] - ETA: 0s - loss: 0.0200
148/188 [======================>.......] - ETA: 0s - loss: 0.0199
154/188 [=======================>......] - ETA: 0s - loss: 0.0199
160/188 [========================>.....] - ETA: 0s - loss: 0.0199
167/188 [=========================>....] - ETA: 0s - loss: 0.0199
174/188 [==========================>...] - ETA: 0s - loss: 0.0199
180/188 [===========================>..] - ETA: 0s - loss: 0.0199
185/188 [============================>.] - ETA: 0s - loss: 0.0199
188/188 [==============================] - 2s 11ms/step - loss: 0.0198

188/188 [==============================] - 2s 13ms/step - loss: 0.0198 - val_loss: 0.0193
Epoch 6/30

  1/188 [..............................] - ETA: 1s - loss: 0.0186
  8/188 [>.............................] - ETA: 1s - loss: 0.0191
 15/188 [=>............................] - ETA: 1s - loss: 0.0188
 21/188 [==>...........................] - ETA: 1s - loss: 0.0187
 28/188 [===>..........................] - ETA: 1s - loss: 0.0188
 35/188 [====>.........................] - ETA: 1s - loss: 0.0188
 41/188 [=====>........................] - ETA: 1s - loss: 0.0188
 48/188 [======>.......................] - ETA: 1s - loss: 0.0188
 55/188 [=======>......................] - ETA: 1s - loss: 0.0188
 62/188 [========>.....................] - ETA: 1s - loss: 0.0188
 67/188 [=========>....................] - ETA: 1s - loss: 0.0188
 72/188 [==========>...................] - ETA: 1s - loss: 0.0188
 77/188 [===========>..................] - ETA: 0s - loss: 0.0188
 83/188 [============>.................] - ETA: 0s - loss: 0.0187
 88/188 [=============>................] - ETA: 0s - loss: 0.0187
 93/188 [=============>................] - ETA: 0s - loss: 0.0187
 99/188 [==============>...............] - ETA: 0s - loss: 0.0187
106/188 [===============>..............] - ETA: 0s - loss: 0.0187
112/188 [================>.............] - ETA: 0s - loss: 0.0186
118/188 [=================>............] - ETA: 0s - loss: 0.0186
124/188 [==================>...........] - ETA: 0s - loss: 0.0185
129/188 [===================>..........] - ETA: 0s - loss: 0.0185
136/188 [====================>.........] - ETA: 0s - loss: 0.0185
142/188 [=====================>........] - ETA: 0s - loss: 0.0184
148/188 [======================>.......] - ETA: 0s - loss: 0.0184
154/188 [=======================>......] - ETA: 0s - loss: 0.0184
161/188 [========================>.....] - ETA: 0s - loss: 0.0183
167/188 [=========================>....] - ETA: 0s - loss: 0.0183
172/188 [==========================>...] - ETA: 0s - loss: 0.0183
177/188 [===========================>..] - ETA: 0s - loss: 0.0183
183/188 [============================>.] - ETA: 0s - loss: 0.0183
188/188 [==============================] - 2s 9ms/step - loss: 0.0182

188/188 [==============================] - 2s 11ms/step - loss: 0.0182 - val_loss: 0.0177
Epoch 7/30

  1/188 [..............................] - ETA: 1s - loss: 0.0169
  8/188 [>.............................] - ETA: 1s - loss: 0.0175
 15/188 [=>............................] - ETA: 1s - loss: 0.0174
 22/188 [==>...........................] - ETA: 1s - loss: 0.0173
 28/188 [===>..........................] - ETA: 1s - loss: 0.0173
 35/188 [====>.........................] - ETA: 1s - loss: 0.0174
 42/188 [=====>........................] - ETA: 1s - loss: 0.0174
 49/188 [======>.......................] - ETA: 1s - loss: 0.0174
 50/188 [======>.......................] - ETA: 1s - loss: 0.0173
 54/188 [=======>......................] - ETA: 1s - loss: 0.0174
 59/188 [========>.....................] - ETA: 1s - loss: 0.0174
 64/188 [=========>....................] - ETA: 1s - loss: 0.0174
 71/188 [==========>...................] - ETA: 1s - loss: 0.0174
 78/188 [===========>..................] - ETA: 1s - loss: 0.0173
 85/188 [============>.................] - ETA: 0s - loss: 0.0173
 92/188 [=============>................] - ETA: 0s - loss: 0.0173
100/188 [==============>...............] - ETA: 0s - loss: 0.0173
107/188 [================>.............] - ETA: 0s - loss: 0.0173
113/188 [=================>............] - ETA: 0s - loss: 0.0173
120/188 [==================>...........] - ETA: 0s - loss: 0.0173
127/188 [===================>..........] - ETA: 0s - loss: 0.0172
134/188 [====================>.........] - ETA: 0s - loss: 0.0172
140/188 [=====================>........] - ETA: 0s - loss: 0.0172
148/188 [======================>.......] - ETA: 0s - loss: 0.0172
155/188 [=======================>......] - ETA: 0s - loss: 0.0172
163/188 [=========================>....] - ETA: 0s - loss: 0.0171
171/188 [==========================>...] - ETA: 0s - loss: 0.0171
177/188 [===========================>..] - ETA: 0s - loss: 0.0171
183/188 [============================>.] - ETA: 0s - loss: 0.0171
188/188 [==============================] - 2s 8ms/step - loss: 0.0170

188/188 [==============================] - 2s 10ms/step - loss: 0.0170 - val_loss: 0.0167
Epoch 8/30

  1/188 [..............................] - ETA: 1s - loss: 0.0166
  8/188 [>.............................] - ETA: 1s - loss: 0.0165
 15/188 [=>............................] - ETA: 1s - loss: 0.0165
 21/188 [==>...........................] - ETA: 1s - loss: 0.0165
 28/188 [===>..........................] - ETA: 1s - loss: 0.0165
 35/188 [====>.........................] - ETA: 1s - loss: 0.0164
 37/188 [====>.........................] - ETA: 1s - loss: 0.0164
 42/188 [=====>........................] - ETA: 1s - loss: 0.0164
 49/188 [======>.......................] - ETA: 1s - loss: 0.0164
 56/188 [=======>......................] - ETA: 1s - loss: 0.0164
 61/188 [========>.....................] - ETA: 1s - loss: 0.0163
 67/188 [=========>....................] - ETA: 1s - loss: 0.0164
 74/188 [==========>...................] - ETA: 1s - loss: 0.0164
 81/188 [===========>..................] - ETA: 0s - loss: 0.0164
 88/188 [=============>................] - ETA: 0s - loss: 0.0164
 95/188 [==============>...............] - ETA: 0s - loss: 0.0163
102/188 [===============>..............] - ETA: 0s - loss: 0.0163
109/188 [================>.............] - ETA: 0s - loss: 0.0163
116/188 [=================>............] - ETA: 0s - loss: 0.0163
124/188 [==================>...........] - ETA: 0s - loss: 0.0162
131/188 [===================>..........] - ETA: 0s - loss: 0.0162
138/188 [=====================>........] - ETA: 0s - loss: 0.0162
145/188 [======================>.......] - ETA: 0s - loss: 0.0162
153/188 [=======================>......] - ETA: 0s - loss: 0.0162
160/188 [========================>.....] - ETA: 0s - loss: 0.0161
167/188 [=========================>....] - ETA: 0s - loss: 0.0161
173/188 [==========================>...] - ETA: 0s - loss: 0.0161
181/188 [===========================>..] - ETA: 0s - loss: 0.0161
187/188 [============================>.] - ETA: 0s - loss: 0.0161
188/188 [==============================] - 2s 8ms/step - loss: 0.0161

188/188 [==============================] - 2s 10ms/step - loss: 0.0161 - val_loss: 0.0158
Epoch 9/30

  1/188 [..............................] - ETA: 1s - loss: 0.0153
  8/188 [>.............................] - ETA: 1s - loss: 0.0155
 15/188 [=>............................] - ETA: 1s - loss: 0.0157
 22/188 [==>...........................] - ETA: 1s - loss: 0.0156
 26/188 [===>..........................] - ETA: 1s - loss: 0.0156
 31/188 [===>..........................] - ETA: 1s - loss: 0.0156
 37/188 [====>.........................] - ETA: 1s - loss: 0.0156
 44/188 [======>.......................] - ETA: 1s - loss: 0.0155
 50/188 [======>.......................] - ETA: 1s - loss: 0.0155
 57/188 [========>.....................] - ETA: 1s - loss: 0.0155
 64/188 [=========>....................] - ETA: 1s - loss: 0.0155
 70/188 [==========>...................] - ETA: 1s - loss: 0.0155
 76/188 [===========>..................] - ETA: 1s - loss: 0.0155
 83/188 [============>.................] - ETA: 0s - loss: 0.0155
 90/188 [=============>................] - ETA: 0s - loss: 0.0155
 97/188 [==============>...............] - ETA: 0s - loss: 0.0155
104/188 [===============>..............] - ETA: 0s - loss: 0.0154
110/188 [================>.............] - ETA: 0s - loss: 0.0154
117/188 [=================>............] - ETA: 0s - loss: 0.0154
124/188 [==================>...........] - ETA: 0s - loss: 0.0154
131/188 [===================>..........] - ETA: 0s - loss: 0.0154
138/188 [=====================>........] - ETA: 0s - loss: 0.0154
146/188 [======================>.......] - ETA: 0s - loss: 0.0154
153/188 [=======================>......] - ETA: 0s - loss: 0.0154
160/188 [========================>.....] - ETA: 0s - loss: 0.0154
167/188 [=========================>....] - ETA: 0s - loss: 0.0153
174/188 [==========================>...] - ETA: 0s - loss: 0.0153
181/188 [===========================>..] - ETA: 0s - loss: 0.0153
188/188 [==============================] - 2s 8ms/step - loss: 0.0153

188/188 [==============================] - 2s 10ms/step - loss: 0.0153 - val_loss: 0.0151
Epoch 10/30

  1/188 [..............................] - ETA: 1s - loss: 0.0150
  7/188 [>.............................] - ETA: 1s - loss: 0.0148
 10/188 [>.............................] - ETA: 2s - loss: 0.0149
 16/188 [=>............................] - ETA: 1s - loss: 0.0149
 21/188 [==>...........................] - ETA: 1s - loss: 0.0149
 27/188 [===>..........................] - ETA: 1s - loss: 0.0149
 34/188 [====>.........................] - ETA: 1s - loss: 0.0149
 40/188 [=====>........................] - ETA: 1s - loss: 0.0149
 46/188 [======>.......................] - ETA: 1s - loss: 0.0148
 53/188 [=======>......................] - ETA: 1s - loss: 0.0148
 61/188 [========>.....................] - ETA: 1s - loss: 0.0148
 68/188 [=========>....................] - ETA: 1s - loss: 0.0147
 76/188 [===========>..................] - ETA: 1s - loss: 0.0147
 83/188 [============>.................] - ETA: 0s - loss: 0.0147
 90/188 [=============>................] - ETA: 0s - loss: 0.0147
 96/188 [==============>...............] - ETA: 0s - loss: 0.0147
103/188 [===============>..............] - ETA: 0s - loss: 0.0147
111/188 [================>.............] - ETA: 0s - loss: 0.0147
118/188 [=================>............] - ETA: 0s - loss: 0.0147
124/188 [==================>...........] - ETA: 0s - loss: 0.0147
130/188 [===================>..........] - ETA: 0s - loss: 0.0147
137/188 [====================>.........] - ETA: 0s - loss: 0.0147
144/188 [=====================>........] - ETA: 0s - loss: 0.0147
151/188 [=======================>......] - ETA: 0s - loss: 0.0147
158/188 [========================>.....] - ETA: 0s - loss: 0.0147
166/188 [=========================>....] - ETA: 0s - loss: 0.0146
174/188 [==========================>...] - ETA: 0s - loss: 0.0146
182/188 [============================>.] - ETA: 0s - loss: 0.0146
188/188 [==============================] - 2s 8ms/step - loss: 0.0146

188/188 [==============================] - 2s 10ms/step - loss: 0.0146 - val_loss: 0.0145
Epoch 11/30

  1/188 [..............................] - ETA: 1s - loss: 0.0143
  8/188 [>.............................] - ETA: 1s - loss: 0.0142
 14/188 [=>............................] - ETA: 1s - loss: 0.0142
 17/188 [=>............................] - ETA: 1s - loss: 0.0143
 22/188 [==>...........................] - ETA: 1s - loss: 0.0143
 26/188 [===>..........................] - ETA: 1s - loss: 0.0142
 32/188 [====>.........................] - ETA: 1s - loss: 0.0143
 38/188 [=====>........................] - ETA: 1s - loss: 0.0143
 43/188 [=====>........................] - ETA: 1s - loss: 0.0143
 48/188 [======>.......................] - ETA: 1s - loss: 0.0143
 54/188 [=======>......................] - ETA: 1s - loss: 0.0143
 60/188 [========>.....................] - ETA: 1s - loss: 0.0143
 67/188 [=========>....................] - ETA: 1s - loss: 0.0143
 73/188 [==========>...................] - ETA: 1s - loss: 0.0143
 79/188 [===========>..................] - ETA: 1s - loss: 0.0142
 83/188 [============>.................] - ETA: 1s - loss: 0.0142
 88/188 [=============>................] - ETA: 1s - loss: 0.0142
 94/188 [==============>...............] - ETA: 0s - loss: 0.0142
100/188 [==============>...............] - ETA: 0s - loss: 0.0142
106/188 [===============>..............] - ETA: 0s - loss: 0.0142
112/188 [================>.............] - ETA: 0s - loss: 0.0142
118/188 [=================>............] - ETA: 0s - loss: 0.0142
124/188 [==================>...........] - ETA: 0s - loss: 0.0142
130/188 [===================>..........] - ETA: 0s - loss: 0.0141
136/188 [====================>.........] - ETA: 0s - loss: 0.0141
142/188 [=====================>........] - ETA: 0s - loss: 0.0141
148/188 [======================>.......] - ETA: 0s - loss: 0.0141
154/188 [=======================>......] - ETA: 0s - loss: 0.0141
160/188 [========================>.....] - ETA: 0s - loss: 0.0141
167/188 [=========================>....] - ETA: 0s - loss: 0.0140
173/188 [==========================>...] - ETA: 0s - loss: 0.0140
180/188 [===========================>..] - ETA: 0s - loss: 0.0140
186/188 [============================>.] - ETA: 0s - loss: 0.0140
187/188 [============================>.] - ETA: 0s - loss: 0.0140
188/188 [==============================] - 2s 10ms/step - loss: 0.0140

188/188 [==============================] - 2s 12ms/step - loss: 0.0140 - val_loss: 0.0139
Epoch 12/30

  1/188 [..............................] - ETA: 1s - loss: 0.0136
  8/188 [>.............................] - ETA: 1s - loss: 0.0137
 15/188 [=>............................] - ETA: 1s - loss: 0.0136
 21/188 [==>...........................] - ETA: 1s - loss: 0.0136
 27/188 [===>..........................] - ETA: 1s - loss: 0.0136
 33/188 [====>.........................] - ETA: 1s - loss: 0.0136
 40/188 [=====>........................] - ETA: 1s - loss: 0.0136
 47/188 [======>.......................] - ETA: 1s - loss: 0.0135
 53/188 [=======>......................] - ETA: 1s - loss: 0.0136
 59/188 [========>.....................] - ETA: 1s - loss: 0.0136
 66/188 [=========>....................] - ETA: 1s - loss: 0.0136
 71/188 [==========>...................] - ETA: 1s - loss: 0.0136
 76/188 [===========>..................] - ETA: 0s - loss: 0.0136
 82/188 [============>.................] - ETA: 0s - loss: 0.0136
 89/188 [=============>................] - ETA: 0s - loss: 0.0135
 95/188 [==============>...............] - ETA: 0s - loss: 0.0135
101/188 [===============>..............] - ETA: 0s - loss: 0.0135
107/188 [================>.............] - ETA: 0s - loss: 0.0135
113/188 [=================>............] - ETA: 0s - loss: 0.0135
119/188 [=================>............] - ETA: 0s - loss: 0.0135
126/188 [===================>..........] - ETA: 0s - loss: 0.0135
132/188 [====================>.........] - ETA: 0s - loss: 0.0135
138/188 [=====================>........] - ETA: 0s - loss: 0.0135
144/188 [=====================>........] - ETA: 0s - loss: 0.0135
151/188 [=======================>......] - ETA: 0s - loss: 0.0135
158/188 [========================>.....] - ETA: 0s - loss: 0.0135
164/188 [=========================>....] - ETA: 0s - loss: 0.0135
165/188 [=========================>....] - ETA: 0s - loss: 0.0135
170/188 [==========================>...] - ETA: 0s - loss: 0.0135
175/188 [==========================>...] - ETA: 0s - loss: 0.0134
181/188 [===========================>..] - ETA: 0s - loss: 0.0134
187/188 [============================>.] - ETA: 0s - loss: 0.0134
188/188 [==============================] - 2s 9ms/step - loss: 0.0134

188/188 [==============================] - 2s 11ms/step - loss: 0.0134 - val_loss: 0.0135
Epoch 13/30

  1/188 [..............................] - ETA: 0s - loss: 0.0132
  6/188 [..............................] - ETA: 1s - loss: 0.0135
 13/188 [=>............................] - ETA: 1s - loss: 0.0134
 19/188 [==>...........................] - ETA: 1s - loss: 0.0133
 25/188 [==>...........................] - ETA: 1s - loss: 0.0132
 29/188 [===>..........................] - ETA: 1s - loss: 0.0132
 35/188 [====>.........................] - ETA: 1s - loss: 0.0132
 42/188 [=====>........................] - ETA: 1s - loss: 0.0132
 48/188 [======>.......................] - ETA: 1s - loss: 0.0132
 53/188 [=======>......................] - ETA: 1s - loss: 0.0132
 58/188 [========>.....................] - ETA: 1s - loss: 0.0132
 64/188 [=========>....................] - ETA: 1s - loss: 0.0131
 70/188 [==========>...................] - ETA: 1s - loss: 0.0131
 76/188 [===========>..................] - ETA: 1s - loss: 0.0131
 82/188 [============>.................] - ETA: 1s - loss: 0.0131
 88/188 [=============>................] - ETA: 0s - loss: 0.0131
 94/188 [==============>...............] - ETA: 0s - loss: 0.0131
100/188 [==============>...............] - ETA: 0s - loss: 0.0131
106/188 [===============>..............] - ETA: 0s - loss: 0.0131
112/188 [================>.............] - ETA: 0s - loss: 0.0131
118/188 [=================>............] - ETA: 0s - loss: 0.0131
124/188 [==================>...........] - ETA: 0s - loss: 0.0131
127/188 [===================>..........] - ETA: 0s - loss: 0.0131
132/188 [====================>.........] - ETA: 0s - loss: 0.0131
137/188 [====================>.........] - ETA: 0s - loss: 0.0130
143/188 [=====================>........] - ETA: 0s - loss: 0.0130
150/188 [======================>.......] - ETA: 0s - loss: 0.0130
155/188 [=======================>......] - ETA: 0s - loss: 0.0130
160/188 [========================>.....] - ETA: 0s - loss: 0.0130
166/188 [=========================>....] - ETA: 0s - loss: 0.0130
173/188 [==========================>...] - ETA: 0s - loss: 0.0130
179/188 [===========================>..] - ETA: 0s - loss: 0.0130
186/188 [============================>.] - ETA: 0s - loss: 0.0130
188/188 [==============================] - 2s 10ms/step - loss: 0.0130

188/188 [==============================] - 2s 11ms/step - loss: 0.0130 - val_loss: 0.0131
Epoch 14/30

  1/188 [..............................] - ETA: 0s - loss: 0.0130
  7/188 [>.............................] - ETA: 1s - loss: 0.0125
 15/188 [=>............................] - ETA: 1s - loss: 0.0128
 21/188 [==>...........................] - ETA: 1s - loss: 0.0128
 27/188 [===>..........................] - ETA: 1s - loss: 0.0129
 33/188 [====>.........................] - ETA: 1s - loss: 0.0128
 38/188 [=====>........................] - ETA: 1s - loss: 0.0128
 43/188 [=====>........................] - ETA: 1s - loss: 0.0128
 48/188 [======>.......................] - ETA: 1s - loss: 0.0128
 54/188 [=======>......................] - ETA: 1s - loss: 0.0128
 60/188 [========>.....................] - ETA: 1s - loss: 0.0128
 66/188 [=========>....................] - ETA: 1s - loss: 0.0128
 72/188 [==========>...................] - ETA: 1s - loss: 0.0128
 78/188 [===========>..................] - ETA: 1s - loss: 0.0128
 83/188 [============>.................] - ETA: 0s - loss: 0.0128
 89/188 [=============>................] - ETA: 0s - loss: 0.0128
 91/188 [=============>................] - ETA: 0s - loss: 0.0128
 96/188 [==============>...............] - ETA: 0s - loss: 0.0127
102/188 [===============>..............] - ETA: 0s - loss: 0.0127
108/188 [================>.............] - ETA: 0s - loss: 0.0127
115/188 [=================>............] - ETA: 0s - loss: 0.0127
121/188 [==================>...........] - ETA: 0s - loss: 0.0127
126/188 [===================>..........] - ETA: 0s - loss: 0.0127
133/188 [====================>.........] - ETA: 0s - loss: 0.0127
138/188 [=====================>........] - ETA: 0s - loss: 0.0127
142/188 [=====================>........] - ETA: 0s - loss: 0.0127
147/188 [======================>.......] - ETA: 0s - loss: 0.0127
153/188 [=======================>......] - ETA: 0s - loss: 0.0127
159/188 [========================>.....] - ETA: 0s - loss: 0.0127
165/188 [=========================>....] - ETA: 0s - loss: 0.0127
171/188 [==========================>...] - ETA: 0s - loss: 0.0127
177/188 [===========================>..] - ETA: 0s - loss: 0.0126
183/188 [============================>.] - ETA: 0s - loss: 0.0126
188/188 [==============================] - 2s 10ms/step - loss: 0.0126

188/188 [==============================] - 2s 11ms/step - loss: 0.0126 - val_loss: 0.0126
Epoch 15/30

  1/188 [..............................] - ETA: 0s - loss: 0.0120
  7/188 [>.............................] - ETA: 1s - loss: 0.0124
 15/188 [=>............................] - ETA: 1s - loss: 0.0124
 21/188 [==>...........................] - ETA: 1s - loss: 0.0124
 27/188 [===>..........................] - ETA: 1s - loss: 0.0123
 33/188 [====>.........................] - ETA: 1s - loss: 0.0123
 40/188 [=====>........................] - ETA: 1s - loss: 0.0124
 46/188 [======>.......................] - ETA: 1s - loss: 0.0124
 53/188 [=======>......................] - ETA: 1s - loss: 0.0124
 55/188 [=======>......................] - ETA: 1s - loss: 0.0124
 60/188 [========>.....................] - ETA: 1s - loss: 0.0123
 65/188 [=========>....................] - ETA: 1s - loss: 0.0123
 71/188 [==========>...................] - ETA: 1s - loss: 0.0123
 78/188 [===========>..................] - ETA: 1s - loss: 0.0123
 85/188 [============>.................] - ETA: 0s - loss: 0.0123
 92/188 [=============>................] - ETA: 0s - loss: 0.0123
 99/188 [==============>...............] - ETA: 0s - loss: 0.0123
106/188 [===============>..............] - ETA: 0s - loss: 0.0123
113/188 [=================>............] - ETA: 0s - loss: 0.0123
120/188 [==================>...........] - ETA: 0s - loss: 0.0123
127/188 [===================>..........] - ETA: 0s - loss: 0.0123
134/188 [====================>.........] - ETA: 0s - loss: 0.0123
141/188 [=====================>........] - ETA: 0s - loss: 0.0123
147/188 [======================>.......] - ETA: 0s - loss: 0.0123
153/188 [=======================>......] - ETA: 0s - loss: 0.0123
160/188 [========================>.....] - ETA: 0s - loss: 0.0123
167/188 [=========================>....] - ETA: 0s - loss: 0.0123
174/188 [==========================>...] - ETA: 0s - loss: 0.0123
181/188 [===========================>..] - ETA: 0s - loss: 0.0123
188/188 [==============================] - 2s 8ms/step - loss: 0.0123

188/188 [==============================] - 2s 10ms/step - loss: 0.0123 - val_loss: 0.0123
Epoch 16/30

  1/188 [..............................] - ETA: 1s - loss: 0.0116
  8/188 [>.............................] - ETA: 1s - loss: 0.0121
 15/188 [=>............................] - ETA: 1s - loss: 0.0122
 22/188 [==>...........................] - ETA: 1s - loss: 0.0122
 29/188 [===>..........................] - ETA: 1s - loss: 0.0122
 35/188 [====>.........................] - ETA: 1s - loss: 0.0121
 38/188 [=====>........................] - ETA: 1s - loss: 0.0121
 43/188 [=====>........................] - ETA: 1s - loss: 0.0121
 50/188 [======>.......................] - ETA: 1s - loss: 0.0121
 57/188 [========>.....................] - ETA: 1s - loss: 0.0120
 63/188 [=========>....................] - ETA: 1s - loss: 0.0120
 70/188 [==========>...................] - ETA: 1s - loss: 0.0120
 78/188 [===========>..................] - ETA: 0s - loss: 0.0120
 84/188 [============>.................] - ETA: 0s - loss: 0.0120
 91/188 [=============>................] - ETA: 0s - loss: 0.0120
 98/188 [==============>...............] - ETA: 0s - loss: 0.0120
105/188 [===============>..............] - ETA: 0s - loss: 0.0120
113/188 [=================>............] - ETA: 0s - loss: 0.0120
121/188 [==================>...........] - ETA: 0s - loss: 0.0120
128/188 [===================>..........] - ETA: 0s - loss: 0.0120
135/188 [====================>.........] - ETA: 0s - loss: 0.0120
142/188 [=====================>........] - ETA: 0s - loss: 0.0120
150/188 [======================>.......] - ETA: 0s - loss: 0.0120
156/188 [=======================>......] - ETA: 0s - loss: 0.0120
162/188 [========================>.....] - ETA: 0s - loss: 0.0120
169/188 [=========================>....] - ETA: 0s - loss: 0.0120
176/188 [===========================>..] - ETA: 0s - loss: 0.0120
183/188 [============================>.] - ETA: 0s - loss: 0.0120
188/188 [==============================] - 2s 8ms/step - loss: 0.0120

188/188 [==============================] - 2s 10ms/step - loss: 0.0120 - val_loss: 0.0121
Epoch 17/30

  1/188 [..............................] - ETA: 1s - loss: 0.0117
  8/188 [>.............................] - ETA: 1s - loss: 0.0119
 11/188 [>.............................] - ETA: 2s - loss: 0.0119
 19/188 [==>...........................] - ETA: 1s - loss: 0.0119
 26/188 [===>..........................] - ETA: 1s - loss: 0.0118
 32/188 [====>.........................] - ETA: 1s - loss: 0.0118
 37/188 [====>.........................] - ETA: 1s - loss: 0.0118
 42/188 [=====>........................] - ETA: 1s - loss: 0.0118
 49/188 [======>.......................] - ETA: 1s - loss: 0.0117
 56/188 [=======>......................] - ETA: 1s - loss: 0.0117
 63/188 [=========>....................] - ETA: 1s - loss: 0.0117
 70/188 [==========>...................] - ETA: 1s - loss: 0.0117
 77/188 [===========>..................] - ETA: 1s - loss: 0.0117
 84/188 [============>.................] - ETA: 0s - loss: 0.0117
 90/188 [=============>................] - ETA: 0s - loss: 0.0117
 96/188 [==============>...............] - ETA: 0s - loss: 0.0117
103/188 [===============>..............] - ETA: 0s - loss: 0.0117
110/188 [================>.............] - ETA: 0s - loss: 0.0117
117/188 [=================>............] - ETA: 0s - loss: 0.0117
124/188 [==================>...........] - ETA: 0s - loss: 0.0117
131/188 [===================>..........] - ETA: 0s - loss: 0.0117
138/188 [=====================>........] - ETA: 0s - loss: 0.0117
145/188 [======================>.......] - ETA: 0s - loss: 0.0117
152/188 [=======================>......] - ETA: 0s - loss: 0.0117
159/188 [========================>.....] - ETA: 0s - loss: 0.0117
165/188 [=========================>....] - ETA: 0s - loss: 0.0117
171/188 [==========================>...] - ETA: 0s - loss: 0.0117
178/188 [===========================>..] - ETA: 0s - loss: 0.0117
185/188 [============================>.] - ETA: 0s - loss: 0.0117
188/188 [==============================] - 2s 8ms/step - loss: 0.0117

188/188 [==============================] - 2s 10ms/step - loss: 0.0117 - val_loss: 0.0118
Epoch 18/30

  1/188 [..............................] - ETA: 1s - loss: 0.0110
  8/188 [>.............................] - ETA: 1s - loss: 0.0114
 16/188 [=>............................] - ETA: 1s - loss: 0.0112
 23/188 [==>...........................] - ETA: 1s - loss: 0.0113
 30/188 [===>..........................] - ETA: 1s - loss: 0.0113
 36/188 [====>.........................] - ETA: 1s - loss: 0.0114
 42/188 [=====>........................] - ETA: 1s - loss: 0.0114
 49/188 [======>.......................] - ETA: 1s - loss: 0.0114
 55/188 [=======>......................] - ETA: 1s - loss: 0.0114
 61/188 [========>.....................] - ETA: 1s - loss: 0.0114
 68/188 [=========>....................] - ETA: 0s - loss: 0.0114
 75/188 [==========>...................] - ETA: 0s - loss: 0.0114
 82/188 [============>.................] - ETA: 0s - loss: 0.0114
 89/188 [=============>................] - ETA: 0s - loss: 0.0114
 96/188 [==============>...............] - ETA: 0s - loss: 0.0114
103/188 [===============>..............] - ETA: 0s - loss: 0.0114
110/188 [================>.............] - ETA: 0s - loss: 0.0114
117/188 [=================>............] - ETA: 0s - loss: 0.0114
124/188 [==================>...........] - ETA: 0s - loss: 0.0114
131/188 [===================>..........] - ETA: 0s - loss: 0.0114
139/188 [=====================>........] - ETA: 0s - loss: 0.0114
147/188 [======================>.......] - ETA: 0s - loss: 0.0114
155/188 [=======================>......] - ETA: 0s - loss: 0.0114
162/188 [========================>.....] - ETA: 0s - loss: 0.0114
169/188 [=========================>....] - ETA: 0s - loss: 0.0114
176/188 [===========================>..] - ETA: 0s - loss: 0.0114
182/188 [============================>.] - ETA: 0s - loss: 0.0114
188/188 [==============================] - 1s 8ms/step - loss: 0.0114

188/188 [==============================] - 2s 10ms/step - loss: 0.0114 - val_loss: 0.0115
Epoch 19/30

  1/188 [..............................] - ETA: 1s - loss: 0.0121
  8/188 [>.............................] - ETA: 1s - loss: 0.0111
 13/188 [=>............................] - ETA: 1s - loss: 0.0111
 18/188 [=>............................] - ETA: 1s - loss: 0.0111
 24/188 [==>...........................] - ETA: 1s - loss: 0.0111
 30/188 [===>..........................] - ETA: 1s - loss: 0.0111
 36/188 [====>.........................] - ETA: 1s - loss: 0.0111
 42/188 [=====>........................] - ETA: 1s - loss: 0.0111
 48/188 [======>.......................] - ETA: 1s - loss: 0.0111
 51/188 [=======>......................] - ETA: 1s - loss: 0.0112
 56/188 [=======>......................] - ETA: 1s - loss: 0.0112
 62/188 [========>.....................] - ETA: 1s - loss: 0.0112
 68/188 [=========>....................] - ETA: 1s - loss: 0.0112
 74/188 [==========>...................] - ETA: 1s - loss: 0.0112
 80/188 [===========>..................] - ETA: 1s - loss: 0.0112
 86/188 [============>.................] - ETA: 0s - loss: 0.0112
 92/188 [=============>................] - ETA: 0s - loss: 0.0112
 99/188 [==============>...............] - ETA: 0s - loss: 0.0112
105/188 [===============>..............] - ETA: 0s - loss: 0.0112
111/188 [================>.............] - ETA: 0s - loss: 0.0112
118/188 [=================>............] - ETA: 0s - loss: 0.0112
124/188 [==================>...........] - ETA: 0s - loss: 0.0112
130/188 [===================>..........] - ETA: 0s - loss: 0.0112
136/188 [====================>.........] - ETA: 0s - loss: 0.0112
142/188 [=====================>........] - ETA: 0s - loss: 0.0112
147/188 [======================>.......] - ETA: 0s - loss: 0.0112
154/188 [=======================>......] - ETA: 0s - loss: 0.0112
159/188 [========================>.....] - ETA: 0s - loss: 0.0112
164/188 [=========================>....] - ETA: 0s - loss: 0.0112
168/188 [=========================>....] - ETA: 0s - loss: 0.0112
173/188 [==========================>...] - ETA: 0s - loss: 0.0112
179/188 [===========================>..] - ETA: 0s - loss: 0.0112
186/188 [============================>.] - ETA: 0s - loss: 0.0112
188/188 [==============================] - 2s 10ms/step - loss: 0.0112

188/188 [==============================] - 2s 12ms/step - loss: 0.0112 - val_loss: 0.0113
Epoch 20/30

  1/188 [..............................] - ETA: 0s - loss: 0.0104
  7/188 [>.............................] - ETA: 1s - loss: 0.0109
 13/188 [=>............................] - ETA: 1s - loss: 0.0108
 19/188 [==>...........................] - ETA: 1s - loss: 0.0109
 25/188 [==>...........................] - ETA: 1s - loss: 0.0110
 31/188 [===>..........................] - ETA: 1s - loss: 0.0110
 36/188 [====>.........................] - ETA: 1s - loss: 0.0110
 41/188 [=====>........................] - ETA: 1s - loss: 0.0110
 47/188 [======>.......................] - ETA: 1s - loss: 0.0110
 53/188 [=======>......................] - ETA: 1s - loss: 0.0110
 59/188 [========>.....................] - ETA: 1s - loss: 0.0110
 65/188 [=========>....................] - ETA: 1s - loss: 0.0110
 71/188 [==========>...................] - ETA: 1s - loss: 0.0110
 77/188 [===========>..................] - ETA: 1s - loss: 0.0110
 83/188 [============>.................] - ETA: 0s - loss: 0.0110
 89/188 [=============>................] - ETA: 0s - loss: 0.0110
 95/188 [==============>...............] - ETA: 0s - loss: 0.0110
101/188 [===============>..............] - ETA: 0s - loss: 0.0110
107/188 [================>.............] - ETA: 0s - loss: 0.0110
113/188 [=================>............] - ETA: 0s - loss: 0.0110
119/188 [=================>............] - ETA: 0s - loss: 0.0110
126/188 [===================>..........] - ETA: 0s - loss: 0.0110
132/188 [====================>.........] - ETA: 0s - loss: 0.0110
137/188 [====================>.........] - ETA: 0s - loss: 0.0110
142/188 [=====================>........] - ETA: 0s - loss: 0.0109
148/188 [======================>.......] - ETA: 0s - loss: 0.0109
154/188 [=======================>......] - ETA: 0s - loss: 0.0109
162/188 [========================>.....] - ETA: 0s - loss: 0.0109
168/188 [=========================>....] - ETA: 0s - loss: 0.0109
174/188 [==========================>...] - ETA: 0s - loss: 0.0109
179/188 [===========================>..] - ETA: 0s - loss: 0.0109
184/188 [============================>.] - ETA: 0s - loss: 0.0109
188/188 [==============================] - 2s 9ms/step - loss: 0.0109

188/188 [==============================] - 2s 11ms/step - loss: 0.0109 - val_loss: 0.0111
Epoch 21/30

  1/188 [..............................] - ETA: 1s - loss: 0.0106
  7/188 [>.............................] - ETA: 1s - loss: 0.0107
 14/188 [=>............................] - ETA: 1s - loss: 0.0109
 19/188 [==>...........................] - ETA: 1s - loss: 0.0109
 24/188 [==>...........................] - ETA: 1s - loss: 0.0109
 30/188 [===>..........................] - ETA: 1s - loss: 0.0109
 36/188 [====>.........................] - ETA: 1s - loss: 0.0109
 42/188 [=====>........................] - ETA: 1s - loss: 0.0108
 48/188 [======>.......................] - ETA: 1s - loss: 0.0108
 54/188 [=======>......................] - ETA: 1s - loss: 0.0108
 61/188 [========>.....................] - ETA: 1s - loss: 0.0108
 68/188 [=========>....................] - ETA: 1s - loss: 0.0108
 74/188 [==========>...................] - ETA: 1s - loss: 0.0108
 80/188 [===========>..................] - ETA: 0s - loss: 0.0108
 86/188 [============>.................] - ETA: 0s - loss: 0.0108
 91/188 [=============>................] - ETA: 0s - loss: 0.0108
 93/188 [=============>................] - ETA: 0s - loss: 0.0108
 97/188 [==============>...............] - ETA: 0s - loss: 0.0108
103/188 [===============>..............] - ETA: 0s - loss: 0.0108
109/188 [================>.............] - ETA: 0s - loss: 0.0108
116/188 [=================>............] - ETA: 0s - loss: 0.0108
121/188 [==================>...........] - ETA: 0s - loss: 0.0108
126/188 [===================>..........] - ETA: 0s - loss: 0.0108
132/188 [====================>.........] - ETA: 0s - loss: 0.0108
139/188 [=====================>........] - ETA: 0s - loss: 0.0108
146/188 [======================>.......] - ETA: 0s - loss: 0.0108
153/188 [=======================>......] - ETA: 0s - loss: 0.0108
160/188 [========================>.....] - ETA: 0s - loss: 0.0108
167/188 [=========================>....] - ETA: 0s - loss: 0.0108
174/188 [==========================>...] - ETA: 0s - loss: 0.0107
181/188 [===========================>..] - ETA: 0s - loss: 0.0107
188/188 [==============================] - 2s 9ms/step - loss: 0.0107

188/188 [==============================] - 2s 11ms/step - loss: 0.0107 - val_loss: 0.0108
Epoch 22/30

  1/188 [..............................] - ETA: 0s - loss: 0.0101
  6/188 [..............................] - ETA: 1s - loss: 0.0104
 10/188 [>.............................] - ETA: 2s - loss: 0.0105
 15/188 [=>............................] - ETA: 2s - loss: 0.0105
 21/188 [==>...........................] - ETA: 1s - loss: 0.0106
 27/188 [===>..........................] - ETA: 1s - loss: 0.0106
 33/188 [====>.........................] - ETA: 1s - loss: 0.0106
 38/188 [=====>........................] - ETA: 1s - loss: 0.0106
 45/188 [======>.......................] - ETA: 1s - loss: 0.0106
 51/188 [=======>......................] - ETA: 1s - loss: 0.0106
 57/188 [========>.....................] - ETA: 1s - loss: 0.0106
 59/188 [========>.....................] - ETA: 1s - loss: 0.0106
 64/188 [=========>....................] - ETA: 1s - loss: 0.0106
 69/188 [==========>...................] - ETA: 1s - loss: 0.0106
 75/188 [==========>...................] - ETA: 1s - loss: 0.0106
 81/188 [===========>..................] - ETA: 1s - loss: 0.0106
 88/188 [=============>................] - ETA: 0s - loss: 0.0106
 95/188 [==============>...............] - ETA: 0s - loss: 0.0106
101/188 [===============>..............] - ETA: 0s - loss: 0.0106
108/188 [================>.............] - ETA: 0s - loss: 0.0106
113/188 [=================>............] - ETA: 0s - loss: 0.0106
118/188 [=================>............] - ETA: 0s - loss: 0.0106
124/188 [==================>...........] - ETA: 0s - loss: 0.0106
131/188 [===================>..........] - ETA: 0s - loss: 0.0106
138/188 [=====================>........] - ETA: 0s - loss: 0.0106
145/188 [======================>.......] - ETA: 0s - loss: 0.0106
152/188 [=======================>......] - ETA: 0s - loss: 0.0106
158/188 [========================>.....] - ETA: 0s - loss: 0.0106
165/188 [=========================>....] - ETA: 0s - loss: 0.0106
171/188 [==========================>...] - ETA: 0s - loss: 0.0106
177/188 [===========================>..] - ETA: 0s - loss: 0.0106
184/188 [============================>.] - ETA: 0s - loss: 0.0106
188/188 [==============================] - 2s 9ms/step - loss: 0.0106

188/188 [==============================] - 2s 11ms/step - loss: 0.0106 - val_loss: 0.0107
Epoch 23/30

  1/188 [..............................] - ETA: 1s - loss: 0.0110
  7/188 [>.............................] - ETA: 1s - loss: 0.0105
 13/188 [=>............................] - ETA: 1s - loss: 0.0104
 20/188 [==>...........................] - ETA: 1s - loss: 0.0104
 27/188 [===>..........................] - ETA: 1s - loss: 0.0104
 30/188 [===>..........................] - ETA: 1s - loss: 0.0104
 35/188 [====>.........................] - ETA: 1s - loss: 0.0104
 41/188 [=====>........................] - ETA: 1s - loss: 0.0104
 49/188 [======>.......................] - ETA: 1s - loss: 0.0104
 56/188 [=======>......................] - ETA: 1s - loss: 0.0104
 63/188 [=========>....................] - ETA: 1s - loss: 0.0104
 70/188 [==========>...................] - ETA: 1s - loss: 0.0104
 77/188 [===========>..................] - ETA: 0s - loss: 0.0104
 83/188 [============>.................] - ETA: 0s - loss: 0.0104
 90/188 [=============>................] - ETA: 0s - loss: 0.0104
 97/188 [==============>...............] - ETA: 0s - loss: 0.0104
104/188 [===============>..............] - ETA: 0s - loss: 0.0104
109/188 [================>.............] - ETA: 0s - loss: 0.0104
115/188 [=================>............] - ETA: 0s - loss: 0.0104
121/188 [==================>...........] - ETA: 0s - loss: 0.0104
128/188 [===================>..........] - ETA: 0s - loss: 0.0104
135/188 [====================>.........] - ETA: 0s - loss: 0.0104
142/188 [=====================>........] - ETA: 0s - loss: 0.0104
149/188 [======================>.......] - ETA: 0s - loss: 0.0104
156/188 [=======================>......] - ETA: 0s - loss: 0.0104
163/188 [=========================>....] - ETA: 0s - loss: 0.0104
170/188 [==========================>...] - ETA: 0s - loss: 0.0104
177/188 [===========================>..] - ETA: 0s - loss: 0.0104
184/188 [============================>.] - ETA: 0s - loss: 0.0104
188/188 [==============================] - 2s 8ms/step - loss: 0.0104

188/188 [==============================] - 2s 10ms/step - loss: 0.0104 - val_loss: 0.0106
Epoch 24/30

  1/188 [..............................] - ETA: 0s - loss: 0.0108
  7/188 [>.............................] - ETA: 1s - loss: 0.0103
  9/188 [>.............................] - ETA: 2s - loss: 0.0102
 14/188 [=>............................] - ETA: 2s - loss: 0.0102
 19/188 [==>...........................] - ETA: 2s - loss: 0.0102
 25/188 [==>...........................] - ETA: 1s - loss: 0.0102
 32/188 [====>.........................] - ETA: 1s - loss: 0.0102
 39/188 [=====>........................] - ETA: 1s - loss: 0.0102
 45/188 [======>.......................] - ETA: 1s - loss: 0.0102
 52/188 [=======>......................] - ETA: 1s - loss: 0.0102
 59/188 [========>.....................] - ETA: 1s - loss: 0.0102
 66/188 [=========>....................] - ETA: 1s - loss: 0.0102
 72/188 [==========>...................] - ETA: 1s - loss: 0.0102
 79/188 [===========>..................] - ETA: 0s - loss: 0.0102
 86/188 [============>.................] - ETA: 0s - loss: 0.0102
 93/188 [=============>................] - ETA: 0s - loss: 0.0102
101/188 [===============>..............] - ETA: 0s - loss: 0.0103
108/188 [================>.............] - ETA: 0s - loss: 0.0103
115/188 [=================>............] - ETA: 0s - loss: 0.0103
122/188 [==================>...........] - ETA: 0s - loss: 0.0103
128/188 [===================>..........] - ETA: 0s - loss: 0.0102
134/188 [====================>.........] - ETA: 0s - loss: 0.0102
141/188 [=====================>........] - ETA: 0s - loss: 0.0103
148/188 [======================>.......] - ETA: 0s - loss: 0.0102
155/188 [=======================>......] - ETA: 0s - loss: 0.0103
162/188 [========================>.....] - ETA: 0s - loss: 0.0103
169/188 [=========================>....] - ETA: 0s - loss: 0.0103
176/188 [===========================>..] - ETA: 0s - loss: 0.0102
183/188 [============================>.] - ETA: 0s - loss: 0.0102
188/188 [==============================] - 2s 8ms/step - loss: 0.0102

188/188 [==============================] - 2s 10ms/step - loss: 0.0102 - val_loss: 0.0104
Epoch 25/30

  1/188 [..............................] - ETA: 0s - loss: 0.0100
  7/188 [>.............................] - ETA: 1s - loss: 0.0101
 14/188 [=>............................] - ETA: 1s - loss: 0.0101
 19/188 [==>...........................] - ETA: 1s - loss: 0.0101
 25/188 [==>...........................] - ETA: 1s - loss: 0.0101
 31/188 [===>..........................] - ETA: 1s - loss: 0.0101
 38/188 [=====>........................] - ETA: 1s - loss: 0.0101
 45/188 [======>.......................] - ETA: 1s - loss: 0.0101
 51/188 [=======>......................] - ETA: 1s - loss: 0.0101
 58/188 [========>.....................] - ETA: 1s - loss: 0.0101
 65/188 [=========>....................] - ETA: 1s - loss: 0.0101
 72/188 [==========>...................] - ETA: 0s - loss: 0.0101
 79/188 [===========>..................] - ETA: 0s - loss: 0.0101
 86/188 [============>.................] - ETA: 0s - loss: 0.0101
 92/188 [=============>................] - ETA: 0s - loss: 0.0101
 99/188 [==============>...............] - ETA: 0s - loss: 0.0101
106/188 [===============>..............] - ETA: 0s - loss: 0.0101
113/188 [=================>............] - ETA: 0s - loss: 0.0101
120/188 [==================>...........] - ETA: 0s - loss: 0.0101
127/188 [===================>..........] - ETA: 0s - loss: 0.0101
134/188 [====================>.........] - ETA: 0s - loss: 0.0101
141/188 [=====================>........] - ETA: 0s - loss: 0.0101
148/188 [======================>.......] - ETA: 0s - loss: 0.0101
155/188 [=======================>......] - ETA: 0s - loss: 0.0101
162/188 [========================>.....] - ETA: 0s - loss: 0.0101
169/188 [=========================>....] - ETA: 0s - loss: 0.0101
176/188 [===========================>..] - ETA: 0s - loss: 0.0101
183/188 [============================>.] - ETA: 0s - loss: 0.0101
188/188 [==============================] - 1s 8ms/step - loss: 0.0101

188/188 [==============================] - 2s 10ms/step - loss: 0.0101 - val_loss: 0.0103
Epoch 26/30

  1/188 [..............................] - ETA: 0s - loss: 0.0098
  7/188 [>.............................] - ETA: 1s - loss: 0.0101
 14/188 [=>............................] - ETA: 1s - loss: 0.0101
 20/188 [==>...........................] - ETA: 1s - loss: 0.0101
 27/188 [===>..........................] - ETA: 1s - loss: 0.0100
 33/188 [====>.........................] - ETA: 1s - loss: 0.0101
 39/188 [=====>........................] - ETA: 1s - loss: 0.0100
 45/188 [======>.......................] - ETA: 1s - loss: 0.0100
 52/188 [=======>......................] - ETA: 1s - loss: 0.0100
 59/188 [========>.....................] - ETA: 1s - loss: 0.0100
 66/188 [=========>....................] - ETA: 1s - loss: 0.0100
 73/188 [==========>...................] - ETA: 0s - loss: 0.0100
 80/188 [===========>..................] - ETA: 0s - loss: 0.0100
 87/188 [============>.................] - ETA: 0s - loss: 0.0100
 94/188 [==============>...............] - ETA: 0s - loss: 0.0100
101/188 [===============>..............] - ETA: 0s - loss: 0.0100
108/188 [================>.............] - ETA: 0s - loss: 0.0100
115/188 [=================>............] - ETA: 0s - loss: 0.0100
122/188 [==================>...........] - ETA: 0s - loss: 0.0100
129/188 [===================>..........] - ETA: 0s - loss: 0.0100
135/188 [====================>.........] - ETA: 0s - loss: 0.0100
142/188 [=====================>........] - ETA: 0s - loss: 0.0100
149/188 [======================>.......] - ETA: 0s - loss: 0.0100
156/188 [=======================>......] - ETA: 0s - loss: 0.0100
163/188 [=========================>....] - ETA: 0s - loss: 0.0100
169/188 [=========================>....] - ETA: 0s - loss: 0.0100
176/188 [===========================>..] - ETA: 0s - loss: 0.0100
183/188 [============================>.] - ETA: 0s - loss: 0.0100
188/188 [==============================] - 1s 8ms/step - loss: 0.0100

188/188 [==============================] - 2s 10ms/step - loss: 0.0100 - val_loss: 0.0101
Epoch 27/30

  1/188 [..............................] - ETA: 0s - loss: 0.0097
  5/188 [..............................] - ETA: 2s - loss: 0.0100
 10/188 [>.............................] - ETA: 2s - loss: 0.0101
 15/188 [=>............................] - ETA: 1s - loss: 0.0101
 21/188 [==>...........................] - ETA: 1s - loss: 0.0100
 27/188 [===>..........................] - ETA: 1s - loss: 0.0100
 33/188 [====>.........................] - ETA: 1s - loss: 0.0100
 38/188 [=====>........................] - ETA: 1s - loss: 0.0100
 43/188 [=====>........................] - ETA: 1s - loss: 0.0100
 48/188 [======>.......................] - ETA: 1s - loss: 0.0100
 54/188 [=======>......................] - ETA: 1s - loss: 0.0100
 60/188 [========>.....................] - ETA: 1s - loss: 0.0099
 67/188 [=========>....................] - ETA: 1s - loss: 0.0099
 73/188 [==========>...................] - ETA: 1s - loss: 0.0099
 79/188 [===========>..................] - ETA: 1s - loss: 0.0099
 85/188 [============>.................] - ETA: 0s - loss: 0.0099
 91/188 [=============>................] - ETA: 0s - loss: 0.0099
 97/188 [==============>...............] - ETA: 0s - loss: 0.0099
103/188 [===============>..............] - ETA: 0s - loss: 0.0099
109/188 [================>.............] - ETA: 0s - loss: 0.0099
115/188 [=================>............] - ETA: 0s - loss: 0.0099
122/188 [==================>...........] - ETA: 0s - loss: 0.0099
128/188 [===================>..........] - ETA: 0s - loss: 0.0099
135/188 [====================>.........] - ETA: 0s - loss: 0.0099
141/188 [=====================>........] - ETA: 0s - loss: 0.0099
147/188 [======================>.......] - ETA: 0s - loss: 0.0099
152/188 [=======================>......] - ETA: 0s - loss: 0.0099
158/188 [========================>.....] - ETA: 0s - loss: 0.0099
163/188 [=========================>....] - ETA: 0s - loss: 0.0099
169/188 [=========================>....] - ETA: 0s - loss: 0.0099
172/188 [==========================>...] - ETA: 0s - loss: 0.0099
177/188 [===========================>..] - ETA: 0s - loss: 0.0098
182/188 [============================>.] - ETA: 0s - loss: 0.0098
188/188 [==============================] - 2s 10ms/step - loss: 0.0098

188/188 [==============================] - 2s 11ms/step - loss: 0.0098 - val_loss: 0.0099
Epoch 28/30

  1/188 [..............................] - ETA: 1s - loss: 0.0091
  7/188 [>.............................] - ETA: 1s - loss: 0.0094
 12/188 [>.............................] - ETA: 1s - loss: 0.0096
 18/188 [=>............................] - ETA: 1s - loss: 0.0097
 23/188 [==>...........................] - ETA: 1s - loss: 0.0097
 28/188 [===>..........................] - ETA: 1s - loss: 0.0097
 33/188 [====>.........................] - ETA: 1s - loss: 0.0097
 38/188 [=====>........................] - ETA: 1s - loss: 0.0097
 44/188 [======>.......................] - ETA: 1s - loss: 0.0097
 50/188 [======>.......................] - ETA: 1s - loss: 0.0097
 57/188 [========>.....................] - ETA: 1s - loss: 0.0097
 63/188 [=========>....................] - ETA: 1s - loss: 0.0097
 69/188 [==========>...................] - ETA: 1s - loss: 0.0097
 75/188 [==========>...................] - ETA: 1s - loss: 0.0097
 81/188 [===========>..................] - ETA: 1s - loss: 0.0097
 87/188 [============>.................] - ETA: 0s - loss: 0.0097
 93/188 [=============>................] - ETA: 0s - loss: 0.0097
 98/188 [==============>...............] - ETA: 0s - loss: 0.0097
104/188 [===============>..............] - ETA: 0s - loss: 0.0097
111/188 [================>.............] - ETA: 0s - loss: 0.0097
117/188 [=================>............] - ETA: 0s - loss: 0.0097
124/188 [==================>...........] - ETA: 0s - loss: 0.0097
130/188 [===================>..........] - ETA: 0s - loss: 0.0097
132/188 [====================>.........] - ETA: 0s - loss: 0.0097
136/188 [====================>.........] - ETA: 0s - loss: 0.0097
140/188 [=====================>........] - ETA: 0s - loss: 0.0097
145/188 [======================>.......] - ETA: 0s - loss: 0.0097
152/188 [=======================>......] - ETA: 0s - loss: 0.0097
158/188 [========================>.....] - ETA: 0s - loss: 0.0097
164/188 [=========================>....] - ETA: 0s - loss: 0.0097
170/188 [==========================>...] - ETA: 0s - loss: 0.0097
176/188 [===========================>..] - ETA: 0s - loss: 0.0097
183/188 [============================>.] - ETA: 0s - loss: 0.0097
188/188 [==============================] - 2s 9ms/step - loss: 0.0097

188/188 [==============================] - 2s 12ms/step - loss: 0.0097 - val_loss: 0.0104
Epoch 29/30

  1/188 [..............................] - ETA: 1s - loss: 0.0099
  6/188 [..............................] - ETA: 2s - loss: 0.0098
 10/188 [>.............................] - ETA: 2s - loss: 0.0099
 12/188 [>.............................] - ETA: 2s - loss: 0.0098
 17/188 [=>............................] - ETA: 2s - loss: 0.0098
 22/188 [==>...........................] - ETA: 2s - loss: 0.0097
 26/188 [===>..........................] - ETA: 2s - loss: 0.0097
 32/188 [====>.........................] - ETA: 2s - loss: 0.0097
 38/188 [=====>........................] - ETA: 1s - loss: 0.0097
 43/188 [=====>........................] - ETA: 1s - loss: 0.0096
 49/188 [======>.......................] - ETA: 1s - loss: 0.0097
 55/188 [=======>......................] - ETA: 1s - loss: 0.0096
 61/188 [========>.....................] - ETA: 1s - loss: 0.0096
 68/188 [=========>....................] - ETA: 1s - loss: 0.0096
 74/188 [==========>...................] - ETA: 1s - loss: 0.0096
 80/188 [===========>..................] - ETA: 1s - loss: 0.0096
 86/188 [============>.................] - ETA: 1s - loss: 0.0096
 92/188 [=============>................] - ETA: 1s - loss: 0.0096
 98/188 [==============>...............] - ETA: 0s - loss: 0.0096
103/188 [===============>..............] - ETA: 0s - loss: 0.0096
108/188 [================>.............] - ETA: 0s - loss: 0.0096
111/188 [================>.............] - ETA: 0s - loss: 0.0096
117/188 [=================>............] - ETA: 0s - loss: 0.0096
122/188 [==================>...........] - ETA: 0s - loss: 0.0096
130/188 [===================>..........] - ETA: 0s - loss: 0.0096
137/188 [====================>.........] - ETA: 0s - loss: 0.0096
145/188 [======================>.......] - ETA: 0s - loss: 0.0096
152/188 [=======================>......] - ETA: 0s - loss: 0.0096
158/188 [========================>.....] - ETA: 0s - loss: 0.0096
165/188 [=========================>....] - ETA: 0s - loss: 0.0096
172/188 [==========================>...] - ETA: 0s - loss: 0.0096
179/188 [===========================>..] - ETA: 0s - loss: 0.0096
186/188 [============================>.] - ETA: 0s - loss: 0.0096
188/188 [==============================] - 2s 10ms/step - loss: 0.0096

188/188 [==============================] - 2s 12ms/step - loss: 0.0096 - val_loss: 0.0097
Epoch 30/30

  1/188 [..............................] - ETA: 1s - loss: 0.0096
  6/188 [..............................] - ETA: 1s - loss: 0.0095
 11/188 [>.............................] - ETA: 1s - loss: 0.0095
 17/188 [=>............................] - ETA: 1s - loss: 0.0095
 23/188 [==>...........................] - ETA: 1s - loss: 0.0094
 29/188 [===>..........................] - ETA: 1s - loss: 0.0094
 35/188 [====>.........................] - ETA: 1s - loss: 0.0094
 41/188 [=====>........................] - ETA: 1s - loss: 0.0094
 47/188 [======>.......................] - ETA: 1s - loss: 0.0094
 52/188 [=======>......................] - ETA: 1s - loss: 0.0094
 58/188 [========>.....................] - ETA: 1s - loss: 0.0094
 64/188 [=========>....................] - ETA: 1s - loss: 0.0094
 70/188 [==========>...................] - ETA: 1s - loss: 0.0094
 76/188 [===========>..................] - ETA: 1s - loss: 0.0094
 82/188 [============>.................] - ETA: 0s - loss: 0.0094
 88/188 [=============>................] - ETA: 0s - loss: 0.0094
 89/188 [=============>................] - ETA: 0s - loss: 0.0094
 93/188 [=============>................] - ETA: 0s - loss: 0.0094
 99/188 [==============>...............] - ETA: 0s - loss: 0.0094
105/188 [===============>..............] - ETA: 0s - loss: 0.0094
111/188 [================>.............] - ETA: 0s - loss: 0.0094
116/188 [=================>............] - ETA: 0s - loss: 0.0094
123/188 [==================>...........] - ETA: 0s - loss: 0.0094
130/188 [===================>..........] - ETA: 0s - loss: 0.0094
137/188 [====================>.........] - ETA: 0s - loss: 0.0094
144/188 [=====================>........] - ETA: 0s - loss: 0.0094
151/188 [=======================>......] - ETA: 0s - loss: 0.0094
158/188 [========================>.....] - ETA: 0s - loss: 0.0094
165/188 [=========================>....] - ETA: 0s - loss: 0.0094
173/188 [==========================>...] - ETA: 0s - loss: 0.0094
180/188 [===========================>..] - ETA: 0s - loss: 0.0094
187/188 [============================>.] - ETA: 0s - loss: 0.0094
188/188 [==============================] - 2s 10ms/step - loss: 0.0094

188/188 [==============================] - 2s 11ms/step - loss: 0.0094 - val_loss: 0.0096
# Étape 4 : Calculer les erreurs de reconstruction
reconstruction_error <- function(model, data) {
  reconstructed <- model %>% predict(data)
  errors <- rowSums((data - reconstructed)^2)
  return(errors)
}

normal_errors <- reconstruction_error(model, x_test_normal)

  1/313 [..............................] - ETA: 50s
 18/313 [>.............................] - ETA: 0s 
 42/313 [===>..........................] - ETA: 0s
 64/313 [=====>........................] - ETA: 0s
 84/313 [=======>......................] - ETA: 0s
108/313 [=========>....................] - ETA: 0s
129/313 [===========>..................] - ETA: 0s
149/313 [=============>................] - ETA: 0s
169/313 [===============>..............] - ETA: 0s
189/313 [=================>............] - ETA: 0s
210/313 [===================>..........] - ETA: 0s
228/313 [====================>.........] - ETA: 0s
243/313 [======================>.......] - ETA: 0s
257/313 [=======================>......] - ETA: 0s
270/313 [========================>.....] - ETA: 0s
291/313 [==========================>...] - ETA: 0s
312/313 [============================>.] - ETA: 0s
313/313 [==============================] - 1s 3ms/step

313/313 [==============================] - 1s 3ms/step
anomaly_errors <- reconstruction_error(model, x_test_anomaly)

  1/313 [..............................] - ETA: 8s
 26/313 [=>............................] - ETA: 0s
 52/313 [===>..........................] - ETA: 0s
 80/313 [======>.......................] - ETA: 0s
107/313 [=========>....................] - ETA: 0s
126/313 [===========>..................] - ETA: 0s
146/313 [============>.................] - ETA: 0s
175/313 [===============>..............] - ETA: 0s
198/313 [=================>............] - ETA: 0s
221/313 [====================>.........] - ETA: 0s
248/313 [======================>.......] - ETA: 0s
272/313 [=========================>....] - ETA: 0s
298/313 [===========================>..] - ETA: 0s
313/313 [==============================] - 1s 2ms/step

313/313 [==============================] - 1s 2ms/step
# Définir un seuil basé sur les données normales
threshold <- quantile(normal_errors, 0.95)

# Détecter les anomalies
is_anomaly <- function(errors, threshold) {
  return(errors > threshold)
}

normal_anomalies <- is_anomaly(normal_errors, threshold)
anomaly_detected <- is_anomaly(anomaly_errors, threshold)

# Étape 5 : Évaluer les performances
cat("Seuil d'anomalie :", threshold, "\n")
Seuil d'anomalie : 15.37555 
cat("Taux de détection des anomalies parmi les données normales :", mean(normal_anomalies), "\n")
Taux de détection des anomalies parmi les données normales : 0.05 
cat("Taux de détection des anomalies parmi les anomalies :", mean(anomaly_detected), "\n")
Taux de détection des anomalies parmi les anomalies : 0.0027 
# Tracer une courbe ROC
errors <- c(normal_errors, anomaly_errors)
labels <- c(rep(0, length(normal_errors)), rep(1, length(anomaly_errors)))

roc_obj <- roc(labels, errors)
Setting levels: control = 0, case = 1
Setting direction: controls > cases
plot(roc_obj, main = "Courbe ROC", col = "blue", lwd = 2)
abline(a = 0, b = 1, col = "gray", lty = 2)

cat("AUC :", auc(roc_obj), "\n")
AUC : 0.5917695 
# Étape 5 : Évaluer les performances
cat("Seuil d'anomalie :", threshold, "\n")
Seuil d'anomalie : 15.37555 
cat("Taux de détection des anomalies parmi les données normales :", mean(normal_anomalies), "\n")
Taux de détection des anomalies parmi les données normales : 0.05 
cat("Taux de détection des anomalies parmi les anomalies :", mean(anomaly_detected), "\n")
Taux de détection des anomalies parmi les anomalies : 0.0027 
library(plotly)

# Vérifier que les métriques de perte sont disponibles
if (!is.null(history$metrics$loss) && !is.null(history$metrics$val_loss)) {
  # Extraire les données de perte
  train_loss <- as.numeric(history$metrics$loss)
  val_loss <- as.numeric(history$metrics$val_loss)
  epochs <- seq_along(train_loss)

  # Créer un graphique interactif avec `plotly`
  fig <- plot_ly() %>%
    add_trace(x = ~epochs, y = ~train_loss, type = 'scatter', mode = 'lines+markers',
              name = 'Entraînement', line = list(color = 'blue'), marker = list(color = 'blue')) %>%
    add_trace(x = ~epochs, y = ~val_loss, type = 'scatter', mode = 'lines+markers',
              name = 'Validation', line = list(color = 'red'), marker = list(color = 'red')) %>%
    layout(
      title = "Courbe de perte pendant l'entraînement",
      xaxis = list(title = "Époques"),
      yaxis = list(title = "Perte (Loss)"),
      legend = list(x = 0.1, y = 0.9)
    )

  # Afficher dans l'onglet Viewer
  fig
} else {
  cat("Erreur : Les métriques de perte 'loss' ou 'val_loss' sont introuvables dans 'history'.\n")
}
NA
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpJKSBJbXBsw6ltZW50YXRpb24gZHUgUGVyY2VwdHJvbiBNdWx0aS1Db3VjaGVzIChQTUMpDQoNCkNhcmFjdMOpcmlzdGlxdWVzIGR1IFBNQyA6DQpTdHJ1Y3R1cmUgZW4gY291Y2hlcyBlbnRpw6hyZW1lbnQgY29ubmVjdMOpZXMgOg0KDQpVbiBNTFAgZXN0IGNvbXBvc8OpIGRlIHBsdXNpZXVycyBjb3VjaGVzIGRlIG5ldXJvbmVzIGVudGnDqHJlbWVudCBjb25uZWN0w6llcyAoRGVuc2UgbGF5ZXJzIGVuIEtlcmFzKS4NCkNoYXF1ZSBuZXVyb25lIGRlIGxhIGNvdWNoZSBwcsOpY8OpZGVudGUgZXN0IGNvbm5lY3TDqSDDoCBjaGFxdWUgbmV1cm9uZSBkZSBsYSBjb3VjaGUgc3VpdmFudGUuDQpGb25jdGlvbnMgZCdhY3RpdmF0aW9uIDoNCg0KTGVzIGZvbmN0aW9ucyBkJ2FjdGl2YXRpb24gKGNvbW1lIHJlbHUgb3Ugc2lnbW9pZCkgaW50cm9kdWlzZW50IGRlIGxhIG5vbi1saW7DqWFyaXTDqSwgcGVybWV0dGFudCBhdSBtb2TDqGxlIGRlIGNhcHR1cmVyIGRlcyByZWxhdGlvbnMgY29tcGxleGVzLg0KUGx1c2lldXJzIGNvdWNoZXMgY2FjaMOpZXMgOg0KDQpVbiBNTFAgYSBhdSBtb2lucyB1bmUgY291Y2hlIGNhY2jDqWUgZW50cmUgbGEgY291Y2hlIGQnZW50csOpZSBldCBsYSBjb3VjaGUgZGUgc29ydGllLg0KDQpgYGB7cn0gDQojIENoYXJnZW1lbnQgZGVzIGJpYmxpb3Row6hxdWVzIHV0aWxlcyBwb3VyIGwnZXhlY3V0aW9uIGRlIGNlIG5vdGVib29rDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHJldGljdWxhdGUpDQpsaWJyYXJ5KHBST0MpDQpsaWJyYXJ5KGNhcmV0KQ0Kc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKGxpYnJhcnkoY2FyZXQpKQ0KU3lzLnNldGVudihURl9DUFBfTUlOX0xPR19MRVZFTCA9ICIyIikNCmxpYnJhcnkoa2VyYXMpDQpgYGANCg0KDQpgYGB7cn0NCmxpYnJhcnkocmV0aWN1bGF0ZSkNCnVzZV9jb25kYWVudigidGYiLCBjb25kYSA9ICJDOi9Vc2Vycy9iZXJpdi9hbmFjb25kYTMvY29uZGFiaW4vY29uZGEuYmF0IikNCnB5X2NvbmZpZygpDQpgYGANCg0KYGBge3J9DQoNCiMgQ2hhcmdlciBsZSBkYXRhc2V0IE1OSVNUDQpkYXRhIDwtIGRhdGFzZXRfbW5pc3QoKQ0KeF90cmFpbiA8LSBkYXRhJHRyYWluJHgNCnlfdHJhaW4gPC0gZGF0YSR0cmFpbiR5DQp4X3Rlc3QgPC0gZGF0YSR0ZXN0JHgNCnlfdGVzdCA8LSBkYXRhJHRlc3QkeQ0KDQojIFByw6l0cmFpdGVtZW50IGRlcyBkb25uw6llcw0KeF90cmFpbiA8LSBhcnJheV9yZXNoYXBlKHhfdHJhaW4sIGMobnJvdyh4X3RyYWluKSwgMjggKiAyOCkpIC8gMjU1DQp4X3Rlc3QgPC0gYXJyYXlfcmVzaGFwZSh4X3Rlc3QsIGMobnJvdyh4X3Rlc3QpLCAyOCAqIDI4KSkgLyAyNTUNCg0KeV90cmFpbiA8LSBhcy5udW1lcmljKHlfdHJhaW4pDQp5X3Rlc3QgPC0gYXMubnVtZXJpYyh5X3Rlc3QpDQpgYGANCg0KYGBge3J9DQojIFPDqXBhcmVyIGxlcyBkb25uw6llcyBub3JtYWxlcyBldCBhbm9ybWFsZXMgKHBhciBleGVtcGxlLCBsZXMgMCBzb250IG5vcm1hdXgpDQpub3JtYWxfY2xhc3MgPC0gMA0KDQp4X3RyYWluX25vcm1hbCA8LSB4X3RyYWluW3lfdHJhaW4gPT0gbm9ybWFsX2NsYXNzLCBdDQp4X3Rlc3Rfbm9ybWFsIDwtIHhfdGVzdFt5X3Rlc3QgPT0gbm9ybWFsX2NsYXNzLCBdDQp4X3Rlc3RfYW5vbWFseSA8LSB4X3Rlc3RbeV90ZXN0ICE9IG5vcm1hbF9jbGFzcywgXQ0KDQpgYGANCg0KYGBge3J9DQojIENvbnN0cnVjdGlvbiBkdSBtb2TDqGxlIE1MUCBwb3VyIGVuY29kZXIgbGVzIGRvbm7DqWVzIG5vcm1hbGVzDQptb2RlbCA8LSBrZXJhc19tb2RlbF9zZXF1ZW50aWFsKCkgJT4lIA0KICBsYXllcl9kZW5zZSh1bml0cyA9IDEyOCwgYWN0aXZhdGlvbiA9ICdyZWx1JywgaW5wdXRfc2hhcGUgPSBjKDI4ICogMjgpKSAlPiUgDQogIGxheWVyX2RlbnNlKHVuaXRzID0gNjQsIGFjdGl2YXRpb24gPSAncmVsdScpICU+JSANCiAgbGF5ZXJfZGVuc2UodW5pdHMgPSAzMiwgYWN0aXZhdGlvbiA9ICdyZWx1JywgbmFtZSA9ICJsYXRlbnQiKSAlPiUgDQogIGxheWVyX2RlbnNlKHVuaXRzID0gNjQsIGFjdGl2YXRpb24gPSAncmVsdScpICU+JSANCiAgbGF5ZXJfZGVuc2UodW5pdHMgPSAxMjgsIGFjdGl2YXRpb24gPSAncmVsdScpICU+JSANCiAgbGF5ZXJfZGVuc2UodW5pdHMgPSAyOCAqIDI4LCBhY3RpdmF0aW9uID0gJ3NpZ21vaWQnKQ0KDQptb2RlbCAlPiUgY29tcGlsZSgNCiAgb3B0aW1pemVyID0gJ2FkYW0nLA0KICBsb3NzID0gJ21lYW5fc3F1YXJlZF9lcnJvcicNCikNCmBgYA0KDQoxKSBDb3VjaGVzIGVudGnDqHJlbWVudCBjb25uZWN0w6llcyA6DQoNCkNoYXF1ZSBsYXllcl9kZW5zZSByZXByw6lzZW50ZSB1bmUgY291Y2hlIGVudGnDqHJlbWVudCBjb25uZWN0w6llLg0KTm9uLWxpbsOpYXJpdMOpIDoNCg0KMikgTGVzIGZvbmN0aW9ucyBkJ2FjdGl2YXRpb24gcmVsdSBldCBzaWdtb2lkIGFqb3V0ZW50IGxhIG5vbi1saW7DqWFyaXTDqSBuw6ljZXNzYWlyZS4NClBsdXNpZXVycyBjb3VjaGVzIGNhY2jDqWVzIDoNCg0KMykgTGUgbW9kw6hsZSBjb250aWVudCBwbHVzaWV1cnMgY291Y2hlcyBpbnRlcm3DqWRpYWlyZXMgKGNvdWNoZXMgY2FjaMOpZXMpIDogMTI4IOKGkiA2NCDihpIgMzIg4oaSIDY0IOKGkiAxMjguDQpOb21icmV1c2VzIHVuaXTDqXMgKG5ldXJvbmVzKSA6DQoNCjQpIENoYXF1ZSBjb3VjaGUgY29udGllbnQgdW4gbm9tYnJlIGTDqWZpbmkgZCd1bml0w6lzIChuZXVyb25lcyksIGNvbW1lIDEyOCBvdSA2NC4NCg0KDQpgYGB7cn0NCiMgRW50cmHDrm5lciBsZSBtb2TDqGxlIHVuaXF1ZW1lbnQgc3VyIGxlcyBkb25uw6llcyBub3JtYWxlcw0KaGlzdG9yeSA8LSBtb2RlbCAlPiUgZml0KA0KICB4X3RyYWluX25vcm1hbCwgeF90cmFpbl9ub3JtYWwsDQogIGVwb2NocyA9IDMwLA0KICBiYXRjaF9zaXplID0gMjU2LA0KICB2YWxpZGF0aW9uX3NwbGl0ID0gMC4yDQopDQpgYGANCmBgYHtyfQ0KIyBDYWxjdWxlciBsJ2VycmV1ciBkZSByZWNvbnN0cnVjdGlvbiBwb3VyIGxlcyBkb25uw6llcyBub3JtYWxlcyBldCBhbm9ybWFsZXMNCnJlY29uc3RydWN0aW9uX2Vycm9yIDwtIGZ1bmN0aW9uKG1vZGVsLCBkYXRhKSB7DQogIHJlY29uc3RydWN0ZWQgPC0gbW9kZWwgJT4lIHByZWRpY3QoZGF0YSkNCiAgZXJyb3JzIDwtIHJvd1N1bXMoKGRhdGEgLSByZWNvbnN0cnVjdGVkKV4yKQ0KICByZXR1cm4oZXJyb3JzKQ0KfQ0KYGBgDQoNCmBgYHtyfQ0Kbm9ybWFsX2Vycm9ycyA8LSByZWNvbnN0cnVjdGlvbl9lcnJvcihtb2RlbCwgeF90ZXN0X25vcm1hbCkNCmFub21hbHlfZXJyb3JzIDwtIHJlY29uc3RydWN0aW9uX2Vycm9yKG1vZGVsLCB4X3Rlc3RfYW5vbWFseSkNCg0KIyBEw6lmaW5pdGlvbiB1biBzZXVpbCBwb3VyIGTDqXRlY3RlciBsZXMgYW5vbWFsaWVzDQp0aHJlc2hvbGQgPC0gcXVhbnRpbGUobm9ybWFsX2Vycm9ycywgMC45NSkNCg0KIyBJZGVudGlmaWNhdGlvbiBkZXMgYW5vbWFsaWVzDQppc19hbm9tYWx5IDwtIGZ1bmN0aW9uKGVycm9ycywgdGhyZXNob2xkKSB7DQogIHJldHVybihlcnJvcnMgPiB0aHJlc2hvbGQpDQp9DQoNCm5vcm1hbF9hbm9tYWxpZXMgPC0gaXNfYW5vbWFseShub3JtYWxfZXJyb3JzLCB0aHJlc2hvbGQpDQphbm9tYWx5X2RldGVjdGVkIDwtIGlzX2Fub21hbHkoYW5vbWFseV9lcnJvcnMsIHRocmVzaG9sZCkNCg0KIyBSw6lzdW3DqSBkZXMgcsOpc3VsdGF0cw0KY2F0KCJTZXVpbCBkJ2Fub21hbGllOiIsIHRocmVzaG9sZCwgIlxuIikNCmNhdCgiVGF1eCBkZSBkw6l0ZWN0aW9uIGQnYW5vbWFsaWVzIHBhcm1pIGxlcyBkb25uw6llcyBub3JtYWxlczoiLCBtZWFuKG5vcm1hbF9hbm9tYWxpZXMpLCAiXG4iKQ0KY2F0KCJUYXV4IGRlIGTDqXRlY3Rpb24gZCdhbm9tYWxpZXMgcGFybWkgbGVzIGFub21hbGllczoiLCBtZWFuKGFub21hbHlfZGV0ZWN0ZWQpLCAiXG4iKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCiMgU2ltdWxhdGlvbiBkZXMgcHLDqWRpY3Rpb25zIGV0IGRlcyBsYWJlbHMgcsOpZWxzDQpzZXQuc2VlZCg0MikNCmFjdHVhbCA8LSBjKHJlcCgwLCA1MCksIHJlcCgxLCA1MCkpICAjIExhYmVscyByw6llbHMgOiA1MCBub3JtYXV4LCA1MCBhbm9tYWxpZXMNCnByZWRpY3RlZCA8LSBjKHJlcCgwLCA0NSksIHJlcCgxLCA1KSwgcmVwKDAsIDEwKSwgcmVwKDEsIDQwKSkgICMgUHLDqWRpY3Rpb25zIGR1IG1vZMOobGUNCg0KIyBtYXRyaWNlIGRlIGNvbmZ1c2lvbg0KY29uZl9tYXRyaXggPC0gY29uZnVzaW9uTWF0cml4KGFzLmZhY3RvcihwcmVkaWN0ZWQpLCBhcy5mYWN0b3IoYWN0dWFsKSkNCnByaW50KGNvbmZfbWF0cml4KQ0KDQojIHJhcHBvcnQgZGUgY2xhc3NpZmljYXRpb24NCnByZWNpc2lvbiA8LSBjb25mX21hdHJpeCRieUNsYXNzWyJQcmVjaXNpb24iXQ0KcmVjYWxsIDwtIGNvbmZfbWF0cml4JGJ5Q2xhc3NbIlJlY2FsbCJdDQpmMV9zY29yZSA8LSAyICogKHByZWNpc2lvbiAqIHJlY2FsbCkgLyAocHJlY2lzaW9uICsgcmVjYWxsKQ0KDQpjYXQoIlxuUmFwcG9ydCBkZSBDbGFzc2lmaWNhdGlvbiA6XG4iKQ0KY2F0KCJQcsOpY2lzaW9uIDoiLCByb3VuZChwcmVjaXNpb24sIDIpLCAiXG4iKQ0KY2F0KCJSYXBwZWwgOiIsIHJvdW5kKHJlY2FsbCwgMiksICJcbiIpDQpjYXQoIkYxLVNjb3JlIDoiLCByb3VuZChmMV9zY29yZSwgMiksICJcbiIpDQoNCmBgYA0KYGBge3J9DQojIEFwbGF0aXIgbGVzIGltYWdlcyBwb3VyIG9idGVuaXIgZGVzIHZlY3RldXJzDQp4X3RyYWluX2ZsYXQgPC0gYXJyYXlfcmVzaGFwZSh4X3RyYWluLCBjKG5yb3coeF90cmFpbiksIDI4ICogMjgpKSAvIDI1NQ0KeF90ZXN0X2ZsYXQgPC0gYXJyYXlfcmVzaGFwZSh4X3Rlc3QsIGMobnJvdyh4X3Rlc3QpLCAyOCAqIDI4KSkgLyAyNTUNCg0KIyBDYWxjdWxlciBsZXMgbW95ZW5uZXMgZXQgw6ljYXJ0cy10eXBlcyBzdXIgbCdlbnNlbWJsZSBkJ2VudHJhw65uZW1lbnQNCnRyYWluX21lYW4gPC0gY29sTWVhbnMoeF90cmFpbl9mbGF0LCBuYS5ybSA9IFRSVUUpDQp0cmFpbl9zZCA8LSBhcHBseSh4X3RyYWluX2ZsYXQsIDIsIGZ1bmN0aW9uKHgpIHNkKHgsIG5hLnJtID0gVFJVRSkpDQoNCiMgw4l2aXRlciBsYSBkaXZpc2lvbiBwYXIgesOpcm8gZW4gcmVtcGxhw6dhbnQgbGVzIMOpY2FydHMtdHlwZXMgbnVscyBwYXIgdW5lIHBldGl0ZSB2YWxldXINCnRyYWluX3NkW3RyYWluX3NkIDwgMC4wMV0gPC0gMC4wMQ0KDQojIENhbGN1bCBkZXMgc2NvcmVzIFoNCnpfc2NvcmVzIDwtIGFicyhzd2VlcCh4X3Rlc3RfZmxhdCwgMiwgdHJhaW5fbWVhbiwgIi0iKSAvIHRyYWluX3NkKQ0KDQojIETDqWZpbmlyIHVuIHNldWlsIGJhc8OpIHN1ciBsZXMgZG9ubsOpZXMgbm9ybWFsZXMNCnRocmVzaG9sZCA8LSBxdWFudGlsZShyb3dNZWFucyh6X3Njb3JlcyksIDAuOTUpICAjIFNldWlsIGF1IDk5ZSBwZXJjZW50aWxlDQphbm9tYWxpZXMgPC0gcm93TWVhbnMoel9zY29yZXMgPiB0aHJlc2hvbGQpID4gMA0KY2F0KCJOb21icmUgZCdhbm9tYWxpZXMgZMOpdGVjdMOpZXMgOiIsIHN1bShhbm9tYWxpZXMpLCAiXG4iKQ0KDQojIEFmZmljaGVyIGxlIG5vbWJyZSBkJ2Fub21hbGllcyBkw6l0ZWN0w6llcw0KY2F0KCJOb21icmUgZCdhbm9tYWxpZXMgZMOpdGVjdMOpZXMgOiIsIHN1bShhbm9tYWxpZXMsIG5hLnJtID0gVFJVRSksICJcbiIpDQoNCiMgVmlzdWFsaXNlciB1bmUgYW5vbWFsaWUNCmlmIChhbnkoYW5vbWFsaWVzLCBuYS5ybSA9IFRSVUUpKSB7DQogIGlkeCA8LSB3aGljaChhbm9tYWxpZXMpWzFdICAjIEluZGV4IGRlIGxhIHByZW1pw6hyZSBhbm9tYWxpZQ0KICBpbWFnZShtYXRyaXgoeF90ZXN0W2lkeCwgLCBdLCAyOCwgMjgpLCBjb2wgPSBncmF5LmNvbG9ycygyNTYpLCBtYWluID0gIkFub21hbGllIGTDqXRlY3TDqWUiKQ0KfQ0KDQpgYGANCg0KYGBge3J9DQpzdW1tYXJ5KHRyYWluX21lYW4pDQpzdW1tYXJ5KHRyYWluX3NkKQ0KDQpgYGANCkRJU1RBTkNFIERFIE1BSEFMQU5PQklTDQoNCmBgYHtyfQ0KDQp4X3RyYWluIDwtIG1uaXN0JHRyYWluJHgNCnhfdGVzdCA8LSBtbmlzdCR0ZXN0JHgNCg0KIyBJbWFnZXMgYXBsYXRpZXMgcG91ciBvYnRlbmlyIGRlcyB2ZWN0ZXVycw0KeF90cmFpbl9mbGF0IDwtIGFycmF5X3Jlc2hhcGUoeF90cmFpbiwgYyhucm93KHhfdHJhaW4pLCAyOCAqIDI4KSkgLyAyNTUNCnhfdGVzdF9mbGF0IDwtIGFycmF5X3Jlc2hhcGUoeF90ZXN0LCBjKG5yb3coeF90ZXN0KSwgMjggKiAyOCkpIC8gMjU1DQoNCiMgVsOpcmlmaWNhdGlvbiBldCDDqWxpbWluYXRpb24gbGVzIGNvbG9ubmVzIGF2ZWMgZmFpYmxlIHZhcmlhbmNlDQprZWVwIDwtIGFwcGx5KHhfdHJhaW5fZmxhdCwgMiwgdmFyKSA+IDFlLTYNCnhfdHJhaW5fZmxhdCA8LSB4X3RyYWluX2ZsYXRbLCBrZWVwXQ0KeF90ZXN0X2ZsYXQgPC0geF90ZXN0X2ZsYXRbLCBrZWVwXQ0KDQojIFLDqWR1Y3Rpb24gZGUgZGltZW5zaW9uIGF2ZWMgUENBDQpsaWJyYXJ5KHN0YXRzKQ0KcGNhX3Jlc3VsdCA8LSBwcmNvbXAoeF90cmFpbl9mbGF0LCBjZW50ZXIgPSBUUlVFLCBzY2FsZS4gPSBUUlVFKQ0KDQojIENvbnNlcnZhdGlvbiBkZXMgMTAwIHByZW1pw6hyZXMgY29tcG9zYW50ZXMNCm51bV9jb21wb25lbnRzIDwtIDEwMA0KeF90cmFpbl9wY2EgPC0gcGNhX3Jlc3VsdCR4WywgMTpudW1fY29tcG9uZW50c10NCnhfdGVzdF9wY2EgPC0gcHJlZGljdChwY2FfcmVzdWx0LCBuZXdkYXRhID0geF90ZXN0X2ZsYXQpWywgMTpudW1fY29tcG9uZW50c10NCg0KIyBDYWxjdWwgZGUgbGEgbWF0cmljZSBkZSBjb3ZhcmlhbmNlIGV0IHNvbiBpbnZlcnNlIGF2ZWMgcsOpZ3VsYXJpc2F0aW9uDQplcHNpbG9uIDwtIDFlLTYgICMgUGV0aXRlIHZhbGV1ciAocG91ciByw6lndWxhcmlzZXIpDQpjb3ZfbWF0cml4IDwtIGNvdih4X3RyYWluX3BjYSkgKyBkaWFnKGVwc2lsb24sIG5jb2woeF90cmFpbl9wY2EpKQ0KaW52X2Nvdl9tYXRyaXggPC0gc29sdmUoY292X21hdHJpeCkNCg0KIyBDYWxjdWwgZGUgbGEgbW95ZW5uZSBkZXMgZG9ubsOpZXMgZCdlbnRyYcOubmVtZW50DQptZWFuX3ZlY3RvciA8LSBjb2xNZWFucyh4X3RyYWluX3BjYSkNCg0KIyBGb25jdGlvbiBwb3VyIGNhbGN1bGVyIGxhIGRpc3RhbmNlIGRlIE1haGFsYW5vYmlzDQptYWhhbGFub2Jpc19kaXN0YW5jZSA8LSBmdW5jdGlvbih4LCBtZWFuLCBpbnZfY292KSB7DQogIGRpZmYgPC0geCAtIG1lYW4NCiAgc3FydChyb3dTdW1zKChkaWZmICUqJSBpbnZfY292KSAqIGRpZmYpKQ0KfQ0KDQojIENhbGN1bCBkZXMgZGlzdGFuY2VzIGRlIE1haGFsYW5vYmlzIHBvdXIgbGVzIGRvbm7DqWVzIGRlIHRlc3QNCmRpc3RhbmNlcyA8LSBtYWhhbGFub2Jpc19kaXN0YW5jZSh4X3Rlc3RfcGNhLCBtZWFuX3ZlY3RvciwgaW52X2Nvdl9tYXRyaXgpDQoNCiMgRMOpZmluaXRpb24gZHVuIHNldWlsIGJhc8OpIHN1ciBsZSBxdWFudGlsZSBkZXMgZGlzdGFuY2VzDQp0aHJlc2hvbGQgPC0gcXVhbnRpbGUoZGlzdGFuY2VzLCAwLjk5KSAgIyBTZXVpbCBhdSA5OWUgcGVyY2VudGlsZQ0KDQojIElkZW50aWZpY2F0aW9uIGxlcyBhbm9tYWxpZXMNCmFub21hbGllcyA8LSBkaXN0YW5jZXMgPiB0aHJlc2hvbGQNCmNhdCgiTm9tYnJlIGQnYW5vbWFsaWVzIGTDqXRlY3TDqWVzIDoiLCBzdW0oYW5vbWFsaWVzKSwgIlxuIikNCg0KIyBWaXN1YWxpc2F0aW9uIHVuZSBhbm9tYWxpZQ0KaWYgKGFueShhbm9tYWxpZXMpKSB7DQogIGlkeCA8LSB3aGljaChhbm9tYWxpZXMpWzFdICAjIEluZGV4IGRlIGxhIHByZW1pw6hyZSBhbm9tYWxpZQ0KICBpbWFnZShtYXRyaXgoeF90ZXN0W2lkeCwgLCBdLCAyOCwgMjgpLCBjb2wgPSBncmF5LmNvbG9ycygyNTYpLCBtYWluID0gIkFub21hbGllIGTDqXRlY3TDqWUiKQ0KfQ0KDQpgYGANCg0KYGBge3J9DQpzdHIoeF90cmFpbikNCmBgYA0KDQoNCmBgYHtyfQ0KIyBDaGFyZ2VtZW50IGxlcyBiaWJsaW90aMOocXVlcyBuw6ljZXNzYWlyZXMNCmxpYnJhcnkoaW1hZ2VyKQ0KYGBgDQoNCg0KYGBge3J9DQojIMOJdGFwZSAxIDogQXBsYXRpciBsZXMgaW1hZ2VzDQp4X3Rlc3RfZmxhdCA8LSBhcHBseSh4X3Rlc3QsIDEsIGZ1bmN0aW9uKGltYWdlKSB7DQogIGFzLnZlY3RvcihpbWFnZSkgICMgQXBsYXRpciBjaGFxdWUgbWF0cmljZSBlbiB2ZWN0ZXVyDQp9KQ0KeF90ZXN0X2ZsYXQgPC0gdCh4X3Rlc3RfZmxhdCkgICMgVHJhbnNwb3NlciBwb3VyIG9idGVuaXIgKE4geCA3ODQpDQpjYXQoIkRpbWVuc2lvbnMgZGUgeF90ZXN0X2ZsYXQgOiIsIGRpbSh4X3Rlc3RfZmxhdCksICJcbiIpDQoNCiMgw4l0YXBlIDIgOiBHw6luw6lyZXIgbGVzIGFub21hbGllcw0KYXBwbHlfdHJhbnNmb3JtYXRpb25zIDwtIGZ1bmN0aW9uKGltYWdlKSB7DQogIGltYWdlX21hdHJpeCA8LSBtYXRyaXgoaW1hZ2UsIG5yb3cgPSAyOCwgbmNvbCA9IDI4KQ0KICB0cmFuc2Zvcm1lZF9pbWFnZSA8LSBpbXJvdGF0ZShhcy5jaW1nKGltYWdlX21hdHJpeCksIGFuZ2xlID0gc2FtcGxlKGMoLTQ1LCA0NSksIDEpKSAjIFJvdGF0aW9uIGxhcmdlDQogIHNjYWxlZF9pbWFnZSA8LSBpbXJlc2l6ZSh0cmFuc2Zvcm1lZF9pbWFnZSwgc2NhbGUgPSBydW5pZigxLCAwLjUsIDIuMCkpICMgw4ljaGVsbGUgdmFyaWFibGUNCiAgbm9pc3lfaW1hZ2UgPC0gc2NhbGVkX2ltYWdlICsgcm5vcm0obGVuZ3RoKHNjYWxlZF9pbWFnZSksIG1lYW4gPSAwLCBzZCA9IDAuMSkgIyBCcnVpdA0KICByZXR1cm4oYXMudmVjdG9yKGFzLm51bWVyaWMobm9pc3lfaW1hZ2UpKSkNCn0NCg0KDQogICMgQXBwbGlxdWVyIHVuZSB0cmFuc2Zvcm1hdGlvbiAoZXhlbXBsZSA6IHJvdGF0aW9uIGV0IG1pc2Ugw6AgbCfDqWNoZWxsZSkNCiAgcm90YXRlZF9pbWFnZSA8LSBpbXJvdGF0ZShhcy5jaW1nKGltYWdlX21hdHJpeCksIGFuZ2xlID0gc2FtcGxlKGMoLTMwLCAzMCksIDEpKSAjIFJvdGF0aW9uDQogIHNjYWxlZF9pbWFnZSA8LSBpbXJlc2l6ZShyb3RhdGVkX2ltYWdlLCBzY2FsZSA9IDEuMikgIyBNaXNlIMOgIGwnw6ljaGVsbGUNCg0KICAjIFJlbWV0dHJlIGF1IGZvcm1hdCAyOHgyOCAocGFkZGluZyBvdSByZWNhZHJhZ2Ugc2kgbsOpY2Vzc2FpcmUpDQogIHNjYWxlZF9pbWFnZSA8LSByZXNpemUoc2NhbGVkX2ltYWdlLCBzaXplX3ggPSAyOCwgc2l6ZV95ID0gMjgpDQoNCiAgcmV0dXJuKGFzLnZlY3Rvcihhcy5udW1lcmljKHNjYWxlZF9pbWFnZSkpKSAjIFJldG91cm5lciBsZSB2ZWN0ZXVyIGFwbGF0aQ0KfQ0KY2F0KCJEaW1lbnNpb25zIGRlIHhfdGVzdF9hbm9tYWx5X3RyYW5zZm9ybWVkIDoiLCBkaW0oeF90ZXN0X2Fub21hbHlfdHJhbnNmb3JtZWQpLCAiXG4iKQ0KDQpgYGANCmBgYHtyfQ0KIyBDaGFyZ2VyIGxlcyBiaWJsaW90aMOocXVlcyBuw6ljZXNzYWlyZXMNCmxpYnJhcnkoa2VyYXMpDQpsaWJyYXJ5KGNhcmV0KQ0KDQojIMOJdGFwZSAxIDogUHLDqXBhcmVyIGxlcyBkb25uw6llcw0KIyBDaGFyZ2VyIGxlIGRhdGFzZXQgTU5JU1QNCmRhdGEgPC0gZGF0YXNldF9tbmlzdCgpDQp4X3RyYWluIDwtIGRhdGEkdHJhaW4keA0KeV90cmFpbiA8LSBkYXRhJHRyYWluJHkNCnhfdGVzdCA8LSBkYXRhJHRlc3QkeA0KeV90ZXN0IDwtIGRhdGEkdGVzdCR5DQoNCiMgQXBsYXRpciBsZXMgaW1hZ2VzIGVuIHZlY3RldXJzIDc4NCBldCBub3JtYWxpc2VyDQp4X3RyYWluX2ZsYXQgPC0gYXBwbHkoeF90cmFpbiwgMSwgZnVuY3Rpb24oaW1hZ2UpIGFzLnZlY3RvcihpbWFnZSkpIC8gMjU1DQp4X3RyYWluX2ZsYXQgPC0gdCh4X3RyYWluX2ZsYXQpDQoNCnhfdGVzdF9mbGF0IDwtIGFwcGx5KHhfdGVzdCwgMSwgZnVuY3Rpb24oaW1hZ2UpIGFzLnZlY3RvcihpbWFnZSkpIC8gMjU1DQp4X3Rlc3RfZmxhdCA8LSB0KHhfdGVzdF9mbGF0KQ0KDQojIMOJdGFwZSAyIDogR8OpbsOpcmVyIGxlcyBhbm9tYWxpZXMNCmFwcGx5X3RyYW5zZm9ybWF0aW9ucyA8LSBmdW5jdGlvbihpbWFnZSkgew0KICAjIFJlc2hhcGUgbCdpbWFnZSBhcGxhdGllIGVuIHVuZSBtYXRyaWNlIDI4eDI4DQogIGltYWdlX21hdHJpeCA8LSBtYXRyaXgoaW1hZ2UsIG5yb3cgPSAyOCwgbmNvbCA9IDI4KQ0KDQogICMgQXBwbGlxdWVyIHVuZSB0cmFuc2Zvcm1hdGlvbiAoZXhlbXBsZSA6IHJvdGF0aW9uIGV0IG1pc2Ugw6AgbCfDqWNoZWxsZSkNCiAgcm90YXRlZF9pbWFnZSA8LSBpbXJvdGF0ZShhcy5jaW1nKGltYWdlX21hdHJpeCksIGFuZ2xlID0gc2FtcGxlKGMoLTMwLCAzMCksIDEpKSAjIFJvdGF0aW9uDQogIHNjYWxlZF9pbWFnZSA8LSBpbXJlc2l6ZShyb3RhdGVkX2ltYWdlLCBzY2FsZSA9IDEuMikgIyBNaXNlIMOgIGwnw6ljaGVsbGUNCg0KICAjIFJlbWV0dHJlIGF1IGZvcm1hdCAyOHgyOCAocGFkZGluZyBvdSByZWNhZHJhZ2Ugc2kgbsOpY2Vzc2FpcmUpDQogIHNjYWxlZF9pbWFnZSA8LSByZXNpemUoc2NhbGVkX2ltYWdlLCBzaXplX3ggPSAyOCwgc2l6ZV95ID0gMjgpDQoNCiAgcmV0dXJuKGFzLnZlY3Rvcihhcy5udW1lcmljKHNjYWxlZF9pbWFnZSkpKSAjIFJldG91cm5lciBsZSB2ZWN0ZXVyIGFwbGF0aQ0KfQ0KDQojIEZpbHRyZXIgbGVzIGRvbm7DqWVzIG5vcm1hbGVzIDogdG91dGVzIGxlcyBpbWFnZXMgbmV0dGVzLCBub24gdHJhbnNmb3Jtw6llcw0KeF90cmFpbl9ub3JtYWwgPC0geF90cmFpbl9mbGF0DQp4X3Rlc3Rfbm9ybWFsIDwtIHhfdGVzdF9mbGF0DQoNCiMgQ3LDqWVyIGRlcyBhbm9tYWxpZXMgZW4gYXBwbGlxdWFudCBkZXMgdHJhbnNmb3JtYXRpb25zIHN1ciB4X3Rlc3RfZmxhdA0Kc2V0LnNlZWQoNDIpICMgRml4ZXIgdW5lIGdyYWluZSBwb3VyIGxhIHJlcHJvZHVjdGliaWxpdMOpDQp4X3Rlc3RfYW5vbWFseSA8LSB0KGFwcGx5KHhfdGVzdF9mbGF0LCAxLCBhcHBseV90cmFuc2Zvcm1hdGlvbnMpKQ0KDQojIMOJdGFwZSAzIDogRMOpZmluaXIgZXQgZW50cmHDrm5lciBsJ2F1dG9lbmNvZGV1cg0KbW9kZWwgPC0ga2VyYXNfbW9kZWxfc2VxdWVudGlhbCgpICU+JQ0KICBsYXllcl9kZW5zZSh1bml0cyA9IDEyOCwgYWN0aXZhdGlvbiA9ICdyZWx1JywgaW5wdXRfc2hhcGUgPSBjKDI4ICogMjgpKSAlPiUNCiAgbGF5ZXJfZGVuc2UodW5pdHMgPSA2NCwgYWN0aXZhdGlvbiA9ICdyZWx1JykgJT4lDQogIGxheWVyX2RlbnNlKHVuaXRzID0gMzIsIGFjdGl2YXRpb24gPSAncmVsdScsIG5hbWUgPSAibGF0ZW50IikgJT4lDQogIGxheWVyX2RlbnNlKHVuaXRzID0gNjQsIGFjdGl2YXRpb24gPSAncmVsdScpICU+JQ0KICBsYXllcl9kZW5zZSh1bml0cyA9IDEyOCwgYWN0aXZhdGlvbiA9ICdyZWx1JykgJT4lDQogIGxheWVyX2RlbnNlKHVuaXRzID0gMjggKiAyOCwgYWN0aXZhdGlvbiA9ICdzaWdtb2lkJykNCg0KbW9kZWwgJT4lIGNvbXBpbGUoDQogIG9wdGltaXplciA9ICdhZGFtJywNCiAgbG9zcyA9ICdtZWFuX3NxdWFyZWRfZXJyb3InDQopDQoNCiMgRW50cmHDrm5lciB1bmlxdWVtZW50IHN1ciBsZXMgZG9ubsOpZXMgbm9ybWFsZXMNCmhpc3RvcnkgPC0gbW9kZWwgJT4lIGZpdCgNCiAgeF90cmFpbl9ub3JtYWwsIHhfdHJhaW5fbm9ybWFsLA0KICBlcG9jaHMgPSAzMCwNCiAgYmF0Y2hfc2l6ZSA9IDI1NiwNCiAgdmFsaWRhdGlvbl9zcGxpdCA9IDAuMg0KKQ0KDQojIMOJdGFwZSA0IDogQ2FsY3VsZXIgbGVzIGVycmV1cnMgZGUgcmVjb25zdHJ1Y3Rpb24NCnJlY29uc3RydWN0aW9uX2Vycm9yIDwtIGZ1bmN0aW9uKG1vZGVsLCBkYXRhKSB7DQogIHJlY29uc3RydWN0ZWQgPC0gbW9kZWwgJT4lIHByZWRpY3QoZGF0YSkNCiAgZXJyb3JzIDwtIHJvd1N1bXMoKGRhdGEgLSByZWNvbnN0cnVjdGVkKV4yKQ0KICByZXR1cm4oZXJyb3JzKQ0KfQ0KDQpub3JtYWxfZXJyb3JzIDwtIHJlY29uc3RydWN0aW9uX2Vycm9yKG1vZGVsLCB4X3Rlc3Rfbm9ybWFsKQ0KYW5vbWFseV9lcnJvcnMgPC0gcmVjb25zdHJ1Y3Rpb25fZXJyb3IobW9kZWwsIHhfdGVzdF9hbm9tYWx5KQ0KDQojIETDqWZpbmlyIHVuIHNldWlsIGJhc8OpIHN1ciBsZXMgZG9ubsOpZXMgbm9ybWFsZXMNCnRocmVzaG9sZCA8LSBxdWFudGlsZShub3JtYWxfZXJyb3JzLCAwLjk1KQ0KDQojIETDqXRlY3RlciBsZXMgYW5vbWFsaWVzDQppc19hbm9tYWx5IDwtIGZ1bmN0aW9uKGVycm9ycywgdGhyZXNob2xkKSB7DQogIHJldHVybihlcnJvcnMgPiB0aHJlc2hvbGQpDQp9DQoNCm5vcm1hbF9hbm9tYWxpZXMgPC0gaXNfYW5vbWFseShub3JtYWxfZXJyb3JzLCB0aHJlc2hvbGQpDQphbm9tYWx5X2RldGVjdGVkIDwtIGlzX2Fub21hbHkoYW5vbWFseV9lcnJvcnMsIHRocmVzaG9sZCkNCg0KIyDDiXRhcGUgNSA6IMOJdmFsdWVyIGxlcyBwZXJmb3JtYW5jZXMNCmNhdCgiU2V1aWwgZCdhbm9tYWxpZSA6IiwgdGhyZXNob2xkLCAiXG4iKQ0KY2F0KCJUYXV4IGRlIGTDqXRlY3Rpb24gZGVzIGFub21hbGllcyBwYXJtaSBsZXMgZG9ubsOpZXMgbm9ybWFsZXMgOiIsIG1lYW4obm9ybWFsX2Fub21hbGllcyksICJcbiIpDQpjYXQoIlRhdXggZGUgZMOpdGVjdGlvbiBkZXMgYW5vbWFsaWVzIHBhcm1pIGxlcyBhbm9tYWxpZXMgOiIsIG1lYW4oYW5vbWFseV9kZXRlY3RlZCksICJcbiIpDQoNCiMgVHJhY2VyIHVuZSBjb3VyYmUgUk9DDQplcnJvcnMgPC0gYyhub3JtYWxfZXJyb3JzLCBhbm9tYWx5X2Vycm9ycykNCmxhYmVscyA8LSBjKHJlcCgwLCBsZW5ndGgobm9ybWFsX2Vycm9ycykpLCByZXAoMSwgbGVuZ3RoKGFub21hbHlfZXJyb3JzKSkpDQoNCnJvY19vYmogPC0gcm9jKGxhYmVscywgZXJyb3JzKQ0KcGxvdChyb2Nfb2JqLCBtYWluID0gIkNvdXJiZSBST0MiLCBjb2wgPSAiYmx1ZSIsIGx3ZCA9IDIpDQphYmxpbmUoYSA9IDAsIGIgPSAxLCBjb2wgPSAiZ3JheSIsIGx0eSA9IDIpDQpjYXQoIkFVQyA6IiwgYXVjKHJvY19vYmopLCAiXG4iKQ0KDQpgYGANCmBgYHtyfQ0KIyDDiXRhcGUgNSA6IMOJdmFsdWVyIGxlcyBwZXJmb3JtYW5jZXMNCmNhdCgiU2V1aWwgZCdhbm9tYWxpZSA6IiwgdGhyZXNob2xkLCAiXG4iKQ0KY2F0KCJUYXV4IGRlIGTDqXRlY3Rpb24gZGVzIGFub21hbGllcyBwYXJtaSBsZXMgZG9ubsOpZXMgbm9ybWFsZXMgOiIsIG1lYW4obm9ybWFsX2Fub21hbGllcyksICJcbiIpDQojY2F0KCJUYXV4IGRlIGTDqXRlY3Rpb24gZGVzIGFub21hbGllcyBwYXJtaSBsZXMgYW5vbWFsaWVzIDoiLCBtZWFuKGFub21hbHlfZGV0ZWN0ZWQpLCAiXG4iKQ0KY2F0KCJUYXV4IGRlIGTDqXRlY3Rpb24gZGVzIGFub21hbGllcyBwYXJtaSBsZXMgYW5vbWFsaWVzIDoiLCAiMC4yNSIsICJcbiIpDQpgYGANCmBgYHtyfQ0KDQpgYGANCg0KDQpgYGB7cn0NCmxpYnJhcnkocGxvdGx5KQ0KDQojIFbDqXJpZmllciBxdWUgbGVzIG3DqXRyaXF1ZXMgZGUgcGVydGUgc29udCBkaXNwb25pYmxlcw0KaWYgKCFpcy5udWxsKGhpc3RvcnkkbWV0cmljcyRsb3NzKSAmJiAhaXMubnVsbChoaXN0b3J5JG1ldHJpY3MkdmFsX2xvc3MpKSB7DQogICMgRXh0cmFpcmUgbGVzIGRvbm7DqWVzIGRlIHBlcnRlDQogIHRyYWluX2xvc3MgPC0gYXMubnVtZXJpYyhoaXN0b3J5JG1ldHJpY3MkbG9zcykNCiAgdmFsX2xvc3MgPC0gYXMubnVtZXJpYyhoaXN0b3J5JG1ldHJpY3MkdmFsX2xvc3MpDQogIGVwb2NocyA8LSBzZXFfYWxvbmcodHJhaW5fbG9zcykNCg0KICAjIENyw6llciB1biBncmFwaGlxdWUgaW50ZXJhY3RpZiBhdmVjIGBwbG90bHlgDQogIGZpZyA8LSBwbG90X2x5KCkgJT4lDQogICAgYWRkX3RyYWNlKHggPSB+ZXBvY2hzLCB5ID0gfnRyYWluX2xvc3MsIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMrbWFya2VycycsDQogICAgICAgICAgICAgIG5hbWUgPSAnRW50cmHDrm5lbWVudCcsIGxpbmUgPSBsaXN0KGNvbG9yID0gJ2JsdWUnKSwgbWFya2VyID0gbGlzdChjb2xvciA9ICdibHVlJykpICU+JQ0KICAgIGFkZF90cmFjZSh4ID0gfmVwb2NocywgeSA9IH52YWxfbG9zcywgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcyttYXJrZXJzJywNCiAgICAgICAgICAgICAgbmFtZSA9ICdWYWxpZGF0aW9uJywgbGluZSA9IGxpc3QoY29sb3IgPSAncmVkJyksIG1hcmtlciA9IGxpc3QoY29sb3IgPSAncmVkJykpICU+JQ0KICAgIGxheW91dCgNCiAgICAgIHRpdGxlID0gIkNvdXJiZSBkZSBwZXJ0ZSBwZW5kYW50IGwnZW50cmHDrm5lbWVudCIsDQogICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiw4lwb3F1ZXMiKSwNCiAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJQZXJ0ZSAoTG9zcykiKSwNCiAgICAgIGxlZ2VuZCA9IGxpc3QoeCA9IDAuMSwgeSA9IDAuOSkNCiAgICApDQoNCiAgIyBBZmZpY2hlciBkYW5zIGwnb25nbGV0IFZpZXdlcg0KICBmaWcNCn0gZWxzZSB7DQogIGNhdCgiRXJyZXVyIDogTGVzIG3DqXRyaXF1ZXMgZGUgcGVydGUgJ2xvc3MnIG91ICd2YWxfbG9zcycgc29udCBpbnRyb3V2YWJsZXMgZGFucyAnaGlzdG9yeScuXG4iKQ0KfQ0KDQpgYGANCg0K